Google スプレッドシートで電話番号とメールアドレスをハッシュ化する方法

8appsチーム·

Google スプレッドシートに組み込みのSHA-256関数はありません。顧客リストを正しくハッシュ化する方法と、同じ番号に2つのハッシュが必要な理由。

誰もがこれを逆に考えています。SHA-256のダイジェストを作ること自体は、Apps Scriptで4行です。広告プラットフォームからマッチを得ることには正規化が必要で、リストが死ぬのは正規化のところです。

Googleは自らのAPIドキュメントではっきり述べています。"If the contact information is not correctly formatted before hashing, the API still accepts the hashed information, but it can't be matched with a customer."

アップロードは成功します。失敗するのはマッチ率です。そして何も教えてくれません。

このガイドは両方の半分を扱います――Google スプレッドシートで実際にハッシュを作る方法と、それが何かにマッチするかどうかを決めるプラットフォーム別の正規化ルールです。前半には4つの方法があります。最短なのは、正規化とハッシュ化を1つの関数で行うアドオン――下記の方法1――であり、このページの残りは、正規化こそ正しくやる価値のある部分だという理由の詳細です。


まず:スプレッドシートにハッシュ関数はありません

Googleが公開している関数リストは17のカテゴリに及びます――日付、エンジニアリング、財務、テキスト、数学など。SHA256もMD5もHASHもDIGESTもありません。 エンジニアリングのカテゴリにあるのは基数変換と複素数で、暗号関連は何もありません。

つまりどの方法も回避策です。4つあり、優劣は同じではありません。

方法こんなときに評価
シートにハッシュ関数を追加するアドオン実際の顧客リストを用意する必要があり、正規化も任せたい推奨
自作のApps Scriptカスタム関数コードを自分で持ちたい、または誰のアドオンにもないアルゴリズムやルールが要る注意すれば可
ウェブのハッシュツール1つのテスト文字列を確認するだけリストには使わない
ハッシュ化しないプラットフォームが平文を受け入れ、社内規程も許している正当な選択

この節では順に見ていきます。後半の正規化ルールは、どの方法を選んでも適用されます――マッチ率を決めるのはそちらであり、どの方法もそこから免れさせてはくれません。


方法1:シートに関数を追加するアドオン

まず手を伸ばすべきはこれです。 理由はこのページ全体の主張そのものです。ダイジェストを作ることは些細です。入力を正しく正規化することが、アップロードが誰かにマッチするかどうかを決めます――そしてそれこそ、アドオンが入力の種類ごとに、すべての行で同じやり方で代行できる工程です。

Hash Data は仕事をそのように分けています。

関数何をするか
=HASHEMAIL(email, [algorithm])空白を除去し、小文字化してからハッシュ化
=HASHPHONE(phone, [algorithm])番号をE.164に整形してからハッシュ化――REGEXREPLACE をダイジェストの数式に連結する代わりに1ステップで
=HASH(value, [algorithm])与えられた値をそのままハッシュ化――正規化なし、大文字小文字を区別

自作スクリプトに対して得られるものが4つあります。

  • 正規化が関数の中にある――新しいシートのたびに作り直す補助列の中ではなく。
  • カスタム関数の30秒の上限を設計で回避する必要がない――実際のリストでなぜこれが効いてくるかは方法2で。
  • リストがスプレッドシートから出ない。 第三者のウェブサイトに何も貼り付けません。
  • SHA3-256が使える――Apps Script自身の computeDigest() は提供していません。

使う関数を左右するので、注意点を1つはっきり書きます。 =HASHPHONE() はE.164に正規化します――先頭に + の付く数字です。これはGoogle Adsが明記するものと一致します。Metaが示す例は逆方向で、数字のみ、+ なしです。ですからMetaへのアップロードでは、=REGEXREPLACE(A2, "[^0-9]", "") で自分で正規化し、その文字列を =HASH() でハッシュ化してください。1つの関数が両方のプラットフォームをまかなえないのは、プラットフォーム同士の規定が一致していないからです――下の比較表が示すのと同じ論点です。

無料枠は1日100回のハッシュ呼び出しまで、有料枠は上限がなくなります。

→ Google Workspace MarketplaceからHash Dataをインストール


方法2:カスタム関数を自分で書く

コードを自分で持ちたいなら、必要なのはこれだけです。拡張機能 → Apps Script を開き、以下を貼り付けて保存し、シートで =SHA256(A2) を使います。

/**
 * 入力の SHA-256 ダイジェストを小文字の16進文字列で返します。
 * 単一セルまたは範囲を受け取ります。
 * @customfunction
 */
function SHA256(input) {
  if (Array.isArray(input)) {
    return input.map(function (row) {
      return row.map(function (cell) { return SHA256(cell); });
    });
  }

  if (input === '' || input === null || input === undefined) return '';

  var bytes = Utilities.computeDigest(
    Utilities.DigestAlgorithm.SHA_256,
    String(input),
    Utilities.Charset.UTF_8
  );

  return bytes
    .map(function (b) { return ((b < 0 ? b + 256 : b)).toString(16).padStart(2, '0'); })
    .join('');
}

ここで多くの人がつまずく点が2つあります。自分でスクリプトを書かない場合でも、どちらも理解しておく価値があります。

computeDigest() は16進文字列ではなく符号付きバイト配列を返します。 Apps ScriptはJava形式の符号付きバイトを返すため、0x7F を超える値は負の数として届きます。b < 0 ? b + 256 : b が直しているのはそれです。省くと - だらけのダイジェストになり、どのプラットフォームも受け付けません。padStart(2, '0') を省くと、各バイトの先頭のゼロが無音で落ち、64文字未満の、非常に気づきにくい形で誤ったダイジェストができあがります。

カスタム関数は30秒以内に返さなければなりません。 さもないとセルに #ERROR! が出ます。1セルずつの方式――各行に数式を1つ――は、実際の顧客リストでは破綻します。上の関数が最初に配列かどうかを判定しているのはそのためです。こう書いておけば、=SHA256(A2:A5000) を1つのセルに入れて、列全体を1つの配列として返させることができます。


方法3:ウェブのハッシュツール

最も慎重に考えるべき方法です。最も手を伸ばしやすく、そして唯一、開示上の問題を抱えているからです。

顧客リストをウェブサイトに貼り付けることは、そのサイトの運営者への個人データの提供です。ハッシュ化がブラウザ内で行われているのか相手のサーバーで行われているのかは、たいていページからは判別できません。そしてその答えは決定的に重要です。テスト用の文字列1つを確認するだけなら問題ありません――このページの後半に、そのために使うべきものがあります。実在する顧客のリストには、使わないでください。


方法4:ハッシュ化しない

忘れられがちな選択肢です。Google Adsは平文の顧客データを受け入れてアップロード前にハッシュ化しますし、TikTokは "accepts both hashed and original values." と明記しています。

ですからハッシュ化する理由が社内規程や契約上のものであるなら、ハッシュ化が答えです。必須だと思い込んでいたのなら、そうでない場合が多いのです――そして事前にハッシュ化するということは、正規化とそこで起こるあらゆる間違いを、プラットフォームではなく自分が引き受けるということです。それを前提にパイプラインを組む前に、知っておく価値があります。


次に:正規化する、それもプラットフォームごとに

ほとんどのガイドが飛ばす部分であり、マッチ率が崩壊する理由でもあります。

Google Ads

カスタマーマッチはハッシュ化する列について、すべて小文字化し、空白を除去し、"Format phone numbers using the E.164 format"、そして明示的に "Include the country code and '+' sign." と明記しています。

GoogleはGmail限定のルールを2か所に記載していますが、それらは同一ではありません――どちらかをパイプラインに写す前に知っておくべきことです。

カスタマーマッチのデータファイルのページはこう述べるだけです。"Remove all periods (.) that precede the domain name in gmail.com and googlemail.com email addresses." ピリオドのみで、それ以外はありません。

カスタマーマッチのAPIページはさらに踏み込みますが、拡張コンバージョンに限定された見出しの下でのことです。ユーザー名部分のピリオドと、プラス記号以降のすべてを除去する、と。示されている例は Jane.Doe+Shopping@googlemail.com → jane.doe+shopping@googlemail.com(小文字化)→ janedoe@googlemail.com です。

つまりプラス以降の除去は拡張コンバージョンについて明記されたものであって、顧客リストのアップロードについてではありません。オーディエンスリストを作っているなら、その仕事についてGoogleが実際に明記しているのはピリオドのルールのほうです。両者が一致している点:これは gmail.com と googlemail.com にのみ適用されます。 すべてのドメインに適用するのはそれ自体がバグです――多くのメールシステムは jane.doe@ と janedoe@ を別人として扱います。

Meta

Metaは別のことを明記しています。メールアドレスについては "Trim any leading and trailing spaces. Convert all characters to lowercase." Gmailのドットのルールはいっさいありません。

電話番号については "Remove symbols, letters, and any leading zeros," に加えて "Always include the country code as part of your customers' phone numbers." Meta自身の例は (650)555-1212 → 16505551212 ――国番号、数字のみ、プラス記号なしです。

つまり同じ電話番号が2つの異なるハッシュを生む

Google AdsMeta
電話番号、明記の内容E.164、"include the country code and '+' sign""Remove symbols… and any leading zeros";例 → 16505551212
Gmailのドットと + 以降gmail.com / googlemail.com はドット除去。+ 以降のルールは拡張コンバージョンについて明記明記なし
エンコード"Use hex SHA256""HEX representations… using lowercase for A through F"

ハッシュ化した1つの列で両方のプラットフォームをまかなうことはできません。使い回していたのなら、それがあなたのマッチ率です。

TikTokは例外

TikTokの明記ははるかに少なめです。"MD5 and SHA256 encryption is supported. The content of the file before encryption needs to be in all uppercase or lowercase." E.164の要件は公開されておらず、ハッシュ化された値と元の値のどちらも受け入れます。Googleのルールがそこでも通用すると思い込まないでください。


数式を、適用する順に

補助列で正規化し、補助列をハッシュ化し、ダイジェストだけを残します。

工程数式
メールアドレス、両プラットフォーム共通=LOWER(TRIM(A2))
TRIM() が見逃すノーブレークスペースの除去=TRIM(SUBSTITUTE(A2, CHAR(160), " "))
Gmailのドットと + 以降、Google Adsのみ――上記の適用範囲の注意を参照(小文字化済みメールである B2 に適用)=IF(REGEXMATCH(B2, "@(gmail|googlemail)\.com$"), SUBSTITUTE(REGEXREPLACE(REGEXEXTRACT(B2, "^[^@]+"), "\+.*$", ""), ".", "") & REGEXEXTRACT(B2, "@.*$"), B2)
電話番号、数字のみ(Meta)=REGEXREPLACE(A2, "[^0-9]", "")
電話番号、E.164(Google Ads)="+" & REGEXREPLACE(A2, "[^0-9]", "")(国番号があると確信できてから)

最後の行には、声に出して言っておくべき注意があります。国内番号に + を前置してもE.164として有効な番号にはなりません。07700 900461 は +7700900461 になり、これは誤りでマッチしません。国番号が実際にそこにある必要があります。


失敗の形を、起こる順に

  1. ハッシュ化する前にスプレッドシートがデータを壊す。 16桁の数字が指数表記になり、07700 900461 は先頭のゼロを失い、+44… は数式として読まれます。何かが入る前に列をプレーンテキストにしてください――後から直すのはデータ損失であって書式設定ではありません。
  2. 大文字小文字と空白。 John@ と john@ は別のダイジェストです。CSVエクスポート由来の末尾の空白が付いた john@x.com と john@x.com も同様です。そして TRIM() はノーブレークスペースを除去しません――ウェブページからのコピー&ペーストが残すのは、まさにそれです。
  3. 表示上の値をハッシュ化する。 (650) 555-1212 は 16505551212 ではありません。セルが電話番号として書式設定されていれば、見えているものとハッシュ化しているものは別の文字列です。
  4. 二重ハッシュ化。 すでにハッシュが入っている列の上で数式を走らせること。簡単な確認方法:SHA-256の16進ダイジェストは常にちょうど64文字の 0-9a-f なので、=LEN(B2)=64 が捕まえます――切り詰めも同時に。
  5. エンコードの誤り。 Base64のダイジェストは、正しい入力に対する有効なハッシュでありながらマッチしません。よく出回るコピー&ペースト用の断片には、MD5かつBase64が既定になっているものが少なくありません。

アップロード前に検証する

Metaは john_smith@gmail.com の期待ダイジェストを公開しています。

62a14e44f765419d10fea99367361a727c12365e2520f32218d505ed9aa0f62f

この文字列をそのまま、あなたの数式でハッシュ化してください。まったく同じ値が返らないなら、直すのは数式であってリストではありません。30秒で済み、外から見ると区別のつかない「ハッシュ化が壊れている」と「リストが悪い」を切り分けられる唯一のテストです。


プライバシーについて正直に一言

ハッシュ化は仮名化であって匿名化ではありません。GDPRは前文第26項でこの点を決着させています。「仮名化を受けた個人データであって、追加的な情報を用いることにより自然人に帰属させうるものは、識別可能な自然人に関する情報とみなされるべきである」。2025年1月のEDPBによる仮名化のガイドラインも、まさにこの出発点の上に組み立てられています。

ソルトなしの電話番号ハッシュは総当たりが可能です――数の空間は、すべて試し尽くせる程度に小さいのです。そしてソルトを付けることはできません。ソルトこそがプラットフォームのマッチングを止めるものだからです。ハッシュ化された顧客データは、依然として顧客データです。そのように扱ってください。

終わったら、ハッシュ化した列をコピーし、値のみを特殊貼り付けし、生の列を削除してください。


全体を、順番に

どの方法を取ったとしても、手順は同じです。

  1. データが入る前に列をプレーンテキストに設定する。
  2. アップロード先のプラットフォームのルールで――もう一方のではなく――補助列で正規化する。
  3. プラットフォームが別途指定しない限り、16進SHA-256で補助列をハッシュ化する。
  4. その列を信頼する前に、Metaが公開するダイジェストに対して既知の文字列を1つテストする。
  5. 範囲全体で =LEN(B2)=64 を確認し、切り詰めと二重ハッシュ化を捕まえる。
  6. 値のみを特殊貼り付けし、生の列を削除して、アップロードする。

工程2と3を単一の関数にまとめるのが Hash Data です――メールアドレスには =HASHEMAIL()、E.164の電話番号には =HASHPHONE()、自分で正規化済みのものには =HASH()。SHA256、MD5、SHA1、SHA512、SHA3-256に対応し、すべてがあなたのスプレッドシートの中で動きます。無料枠は1日100回のハッシュ呼び出しまで、有料枠は上限がなくなります。


出典

プラットフォームの仕様は2026年8月20日に確認しました。広告プラットフォームはこれらのページを改訂します。大規模なアップロードの前に出典を確認してください。


関連記事