web-dev-qa-db-ja.com

Googleスプレッドシートのセルテキストのハッシュ

特定のセルでテキストのMD5またはSHA1ハッシュを計算し、Googleスプレッドシートの別のセルに設定するにはどうすればよいですか?

=ComputeMD5(A1)=ComputeSHA1(A1)のような式はありますか?

それとも、このためのカスタム式を書くことは可能ですか?どうやって?

34
HDB

_Tools > Script Editor_を開き、次のコードを貼り付けます。

_function MD5 (input) {
  var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input);
  var txtHash = '';
  for (i = 0; i < rawHash.length; i++) {
    var hashVal = rawHash[i];
    if (hashVal < 0) {
      hashVal += 256;
    }
    if (hashVal.toString(16).length == 1) {
      txtHash += '0';
    }
    txtHash += hashVal.toString(16);
  }
  return txtHash;
}
_

その後、スクリプトを保存し、セルを参照しながらスプレッドシートでMD5()関数を使用します。

このスクリプトは、 tilities.computeDigest() 関数に基づいています。

76
gabhubert

コードを提供してくれたgabhubertに感謝します。

これはそのコードのSHA1バージョンです(非常に簡単な変更)

function GetSHA1(input) {
  var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_1, input);
  var txtHash = '';
  for (j = 0; j <rawHash.length; j++) {
    var hashVal = rawHash[j];
    if (hashVal < 0)
      hashVal += 256; 
    if (hashVal.toString(16).length == 1)
     txtHash += "0";
    txtHash += hashVal.toString(16);
    }
  return txtHash;
}
20
Sean Thompson

はい、わかった、

http://code.google.com/googleapps/appsscript/articles/custom_function.html で説明されているカスタム関数を作成する必要があります

そして http://code.google.com/googleapps/appsscript/service_utilities.html で説明されているようにAPIを使用します

結果をセルで確認できるように、完全な関数名を手書き入力する必要があります。

以下は、テキストのbase 64エンコードハッシュを与えたコードのサンプルです。

function getBase64EncodedMD5(text)
{ 
  return Utilities.base64Encode( Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, text));
}
5
HDB

セル範囲のハッシュを取得するには、gabhubertの関数の次を追加します。

function RangeGetMD5Hash(input) {
  if (input.map) {            // Test whether input is an array.
    return input.map(GetMD5Hash); // Recurse over array if so.
  } else {
    return GetMD5Hash(input)
  }
}

そして、この方法でセルで使用します:

=RangeGetMD5Hash(A5:X25)

ソース1と同じディメンションの範囲を返します。値は数式を使用してセルから右下に広がります。

これは、単一値関数から範囲関数への汎用的な変換方法( ref )であり、各セルの個別の式よりもはるかに高速です。この形式では、単一セルでも機能するため、この方法でソース関数を書き換える価値があるかもしれません。

2
LogicDaemon

このソリューションと他のソリューションの違いは次のとおりです。

1)上記のソリューションの一部が_Utilities.computeDigest_の出力をオフセットする問題を修正します(256ではなく128でオフセットします)

2)JSON.stringify()に渡す前にinputUtilities.computeDigest()を呼び出すことで、他のソリューションが異なる入力に対して同じハッシュを生成する問題を修正します。

_function MD5(input) {
  var result = "";
  var byteArray = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, JSON.stringify(input));
  for (i=0; i < byteArray.length; i++) {
    result += (byteArray[i] + 128).toString(16) + "-";
  }
  result = result.substring(result, result.length - 1); // remove trailing dash
  return result;
}
_
1
Peter Berg

行全体から結果を取得する場合は、@ gabhubertの回答を使用してこれを実行できます。スクリプトエディタから。

function GetMD5Hash(value) {
  var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, value);
  var txtHash = '';
    for (j = 0; j <rawHash.length; j++) {
   var hashVal = rawHash[j];
    if (hashVal < 0)
      hashVal += 256; 
    if (hashVal.toString(16).length == 1)
      txtHash += "0";
    txtHash += hashVal.toString(16);
  }
    return txtHash;
}

function straightToText() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var r = 1;
  var n_rows = 9999;
  var n_cols = 1;
  var column = 1;
  var sheet = ss[0].getRange(r, column, n_rows, ncols).getValues(); // get first sheet, a1:a9999
  var results = [];
  for (var i = 0; i < sheet.length; i++) {
    var hashmd5= GetMD5Hash(sheet[i][0]);
    results.Push(hashmd5);
  }
  var dest_col = 3;
  for (var j = 0; j < results.length; j++) {
    var row = j+1;
    ss[0].getRange(row, dest_col).setValue(results[j]);  // write output to c1:c9999 as text
  }  
}

次に、[実行]メニューから、関数straightToText()を実行するだけで、結果を取得し、関数エラーの呼び出しが多すぎないようにできます。

1
Albert Camps

@gabhubertに基づきますが、配列演算を使用して16進表現を取得します

function sha(str){
    return Utilities
      .computeDigest(Utilities.DigestAlgorithm.SHA_1, str) // string to digested array of integers
      .map(function(val) {return val<0? val+256 : val}) // correct the offset
      .map(function(val) {return ("00" + val.toString(16)).slice(-2)}) // add padding and enconde
      .join(''); // join in a single string
}
1
dinigo

より短い結果を提供するオプションを探していました。これについてどう思う? 4文字のみを返します。残念な点は、iとoを使用していることです。これらはそれぞれLと0と混同される可能性があります。適切なフォントと大文字を使用すると、大した問題にはなりません。

function getShortMD5Hash(input) {
  var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input);
  var txtHash = '';
    for (j = 0; j < 16; j += 8) { 
    hashVal = (rawHash[j] + rawHash[j+1] + rawHash[j+2] + rawHash[j+3]) ^ (rawHash[j+4] + rawHash[j+5] + rawHash[j+6] + rawHash[j+7])
    if (hashVal < 0)
      hashVal += 1024;
    if (hashVal.toString(36).length == 1)
      txtHash += "0";
    txtHash += hashVal.toString(36);
  }
    return txtHash.toUpperCase();
  }
0
donL