WhatsApp のメッセージを Google Sheets に記録し、シートから送信する
番号の Webhook 送信先を n8n ワークフローに向け、Google Sheets ノードでメッセージごとに 1 行を追加します。記録する項目は送信者、名前、本文、メッセージ ID、時刻です。シートから送信するには、Apps Script の関数で行をループし、UrlFetchApp で Cloud API を呼び出します。その際、番号の電話番号 ID とアクセストークンを使います。チームはこれまでどおり WhatsApp Business アプリで返信を続けられます。
Google Sheets API で 1 分あたりに許可される書き込みリクエスト数は、プロジェクトごとのユーザー単位の上限で、プロジェクト全体では 300 です。
Apps Script の URL Fetch 呼び出し回数(個人の Google アカウントの場合)。Workspace アカウントは 100,000 です。
Apps Script の 1 回の実行が停止されるまでの最長時間です。
WhatsApp のメッセージはどのように 1 行になるのですか?
Meta は、番号に届いたすべてのメッセージを、設定した Webhook の送信先に送ります。ここでは n8n の Webhook ノードが送信先となり、Meta の検証リクエストにも応答します。次のノードは Google Sheets で、操作に Append Row を選びます。ペイロードの項目を列に割り当てます。送信者の番号、プロフィール名、本文、WhatsApp のメッセージ ID、タイムスタンプ、受信側の電話番号 ID です。
再試行しても問題が起きないようにするには、単純な追加ではなく、メッセージ ID をキーにした Append or Update Row を使ってください。Meta は配信に失敗したと判断するとメッセージを再送します。ID をキーにしておけば、2 回目の配信は同じ行の更新として処理されます。
Coexistence 番号では、WhatsApp Business アプリで入力した返信も、smb_message_echoes イベントとして同じ Webhook に届きます。方向を示す列を設けて記録すれば、シートにはやり取りの両側が残ります。
Sheets のクォータが問題になるのはどこですか?
ユーザーごとの書き込みです。Sheets API の書き込みリクエストは、プロジェクトあたり 1 分間に 300 件、プロジェクト内のユーザーあたり 1 分間に 60 件まで許可されます。n8n の認証情報は 1 ユーザーとして数えられます。そのため、メッセージごとに 1 行を追加するワークフローで継続的に処理できるのは、1 秒に約 1 件のメッセージです。
多くの店舗の番号なら、これで十分です。足りなくなるのは、一斉送信したメッセージテンプレートに数百人のお客様が数分以内に返信したときです。API は 429 Too Many Requests を返し、再試行がなければ行が欠落します。
対処法は 2 つあり、どちらか一方で足ります。1 つ目は、Google Sheets ノードで待機付きの再試行を有効にする方法です。指数的にバックオフするという Google 自身の推奨にも沿っています。2 つ目はバッチ処理です。n8n で 30 秒間メッセージを集め、1 回のリクエストでまとめて追加すれば、多数の書き込みが 1 回になります。
シートからメッセージテンプレートを送るにはどうしますか?
シートの拡張機能メニューから Apps Script を使います。関数が未送信の行を読み取り、行ごとに UrlFetchApp で Cloud API の messages エンドポイントを呼び出します。返されたメッセージ ID と時刻は、その行に書き戻します。時間主導型トリガーで数分おきに実行することも、カスタムメニューから手動で実行することもできます。
アクセストークンはコードに直接書かず、スクリプトのプロパティに保存してください。スクリプトを閲覧できる人にトークンが見えてしまうのを防げます。
クォータにも注意が必要です。URL Fetch の呼び出しは、個人の Google アカウントでは 1 日 20,000 回、Workspace アカウントでは 100,000 回までです。また、1 回の実行は 6 分で停止します。行を小分けにして処理し、次へ進む前に各行を送信済みにしてください。停止した実行も、続きから再開でき、二重送信を避けられます。
function sendPending() {
const token = PropertiesService.getScriptProperties().getProperty("WHATSAPP_TOKEN");
const sheet = SpreadsheetApp.getActive().getSheetByName("Send");
const rows = sheet.getDataRange().getValues();
for (let i = 1; i < rows.length; i++) {
const [phone, name, sentAt] = rows[i];
if (sentAt) continue;
const res = UrlFetchApp.fetch("https://graph.facebook.com/v23.0/<PHONE_NUMBER_ID>/messages", {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + token },
payload: JSON.stringify({
messaging_product: "whatsapp", to: String(phone), type: "template",
template: { name: "order_ready", language: { code: "en" },
components: [{ type: "body", parameters: [{ type: "text", text: name }] }] },
}),
});
sheet.getRange(i + 1, 3).setValue(new Date());
}
}よくある間違い
- メッセージ ID をキーにせずに追加している。Meta の再送によって、同じメッセージが 2 行に書き込まれます。
- 返信が集中する間、1 つの認証情報でメッセージごとに 1 行を書き込んでいる。ユーザーあたり 1 分間 60 件の書き込み上限により 429 が返り、行が失われます。
- 24 時間以内にメッセージを送っていない相手に、シートからフリーテキストを送っている。この時間枠の外で届くのは、承認済みのメッセージテンプレートだけです。
easycoexistence.com で番号を接続し、その Webhook の送信先を n8n ワークフローに向けて、電話番号 ID とトークンをスクリプトにコピーします。料金は 1 番号あたり月額 US$ 9 から、番号を追加するほど US$ 1 までで、最初の 3 日間は無料です。
よくある質問
n8n の代わりに Make や Zapier も使えますか?
はい。Make のカスタム Webhook または Zapier の catch hook でメッセージを受け取り、それぞれの Google Sheets のステップで行を追加します。
n8n はどの Google アカウントとして書き込みますか?
n8n の Google 認証情報を承認したアカウントです。このアカウントにはシートの編集権限が必要で、ワークフローが消費するのも、そのアカウントのユーザーあたりの書き込みクォータです。
電話番号の列は正しく書式設定されていますか?
番号はプレーンテキストで保存してください。国番号付きで、プラス記号のない数字だけという、Meta が送る形式です。そうしないと Sheets が数値として扱い、先頭のプラス記号が消えたり、長い値の表示形式が変わったりすることがあります。
EasyCoexistence はメッセージのコピーを保持しますか?
いいえ。Meta が各 Webhook をお客様の n8n の URL に配信するため、シートが唯一のコピーになります。
続きを読む
始める準備はできましたか?
WhatsApp Coexistence の設定は数分で完了し、数か月もかかりません。スマートフォン上のアプリも引き続き使えます。
無料トライアルを始める確認日