Google フォームには、回答を Slack へ送る設定がありません。そのため、通知には何らかの中継が必要です。
この記事では、Samurai App のワークフローを中継にする 2 つの方法を比べ、順に手順を説明します。
結論
Samurai App のサービス連携には Google フォームの出来事がありません。次のどちらかで受けます。
| Apps Script + 外部トリガー | 回答シート + サービス連携 | |
|---|---|---|
| 動くきっかけ | フォームの送信 | スプレッドシートの行の追加 |
| 遅れ | 送信の直後に起動 | 最大 15 分 |
| 届く値 | 設問名と回答(コードで決める) | 行の値の一覧。列の見出しは含まない |
| 準備 | スクリプトとトリガーの作成 | 回答先シートの作成と Sheets の接続 |
| 費用の目安 | 外部トリガーの受信にサービス連携の費用はかからない | 1 件受けるごとに約 0.5 円 |
すぐ知りたい問い合わせや申し込みなら Apps Script、コードを置きたくない場合や数分の遅れで困らない場合は回答シートが向いています。
できること・できないこと
- Apps Script の道では、シークレットをヘッダーで送れます。
UrlFetchAppはヘッダーを指定できるので、URL の?k=は使いません - Apps Script のトリガーは、作った人のアカウントで動きます。 担当者が変わるときは、新しい担当者のアカウントでトリガーを作り直してください
- 外部トリガーの起動は既定で 1 分 10 回、本文は 64 KiB までです。 上限を超えると 429 が返ります。下のコードは送り直さないので、その回答は通知されません。Apps Script の実行の記録で確認し、回答はフォーム側で読みます
- 選択式の設問に答えなかった場合、その設問は届きません。 Google の資料では、未回答の短文や段落は空文字が返り、それ以外の種類は一覧から外れます。チェックボックスの回答は文字列の配列で届きます
- 回答シートの道では、見出しが届きません。
row_dataは行の値だけの一覧です
用意するもの
- 通知したい Google フォームの編集権限
- 投稿先チャンネルの Slack の Incoming Webhook の URL
- Samurai App のマネージャー以上の権限(外部トリガーとサービス連携の追加に必要です)
手順(Apps Script + 外部トリガー)
完成すると、次のようなワークフローになります。

1. 通知先を登録する

Slack のアプリ設定で「Incoming Webhooks」を有効にし、「Add New Webhook to Workspace」でチャンネルを選んで URL を作ります。Samurai App の「設定」→「通知」の「通知先」に名前と URL を登録し、「テスト送信」で確認します。
2. ワークフローを作って公開する
「ワークフロー」の「作成」から「新規作成」を選びます。ステップを選んでいない状態の「設定」にある「ワークフローの入力」で「入力の項目を追加」を押し、名前を event、種類を「項目の組」にします。
ステップは「通知先へ送る」を 1 つ置き、「本文」に次を書きます。
{{input.event.title}} に回答がありました({{input.event.submittedAt}})
{{input.event.summary}}
「保存」のあと、「バージョン」タブで「バージョン N を公開」を押します。未公開のままだと、外部トリガーの呼び出しは 422 で断られ、本文に「このワークフローはまだ公開されていません。公開してから実行してください」と返ります。
3. 外部トリガーを発行する

「トリガー」タブの「外部トリガーを追加」から登録します。URL とシークレットが発行されます。シークレットは作った直後に 1 度だけ表示されるので、その場で控えます。
4. Apps Script にコードを置く
フォームの編集画面の「その他」から「Apps Script」を開きます。左の「プロジェクトの設定」の「スクリプト プロパティ」に、TRIGGER_URL と TRIGGER_SECRET を保存します。コードに直接書くと、スクリプトを見られる人にシークレットが見えてしまうためです。
エディタには次を貼り付けます。
function onFormSubmit(e) {
const props = PropertiesService.getScriptProperties();
const summary = e.response.getItemResponses().map((item) => {
const answer = [].concat(item.getResponse()).join("、");
return item.getItem().getTitle() + ": " + answer;
}).join("\n");
UrlFetchApp.fetch(props.getProperty("TRIGGER_URL"), {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + props.getProperty("TRIGGER_SECRET") },
payload: JSON.stringify({
title: e.source.getTitle(),
submittedAt: Utilities.formatDate(e.response.getTimestamp(), "Asia/Tokyo", "yyyy/MM/dd HH:mm"),
summary: summary,
}),
});
}
5. フォーム送信時のトリガーを付ける
左の「トリガー」で「トリガーを追加」を押します。実行する関数に onFormSubmit、イベントのソースにフォーム、イベントの種類にフォーム送信時を選んで保存します。初回は権限の確認が出るので、内容を読んで許可します。
6. 回答して確認する
フォームに 1 件回答します。Slack に届けば完了です。「実行」タブの「最近の実行」に「外部から起動」の行が増えます。
手順(回答シート + サービス連携)
1. 回答先のスプレッドシートを作る
フォームの「回答」タブからスプレッドシートにリンクします。URL の /d/ と /edit の間が、スプレッドシートの ID です。
2. Google Sheets を接続する
「コネクタ」画面の「コネクタ」タブで Google Sheets の「追加」を押し、「標準連携アプリで追加」を選んでサインインします。
3. ワークフローを作って公開する
入力の event と「通知先へ送る」は上と同じです。「本文」には次のように書きます。
フォームに回答がありました(シートの {{input.event.row_number}} 行目)
{{input.event.row_data}}
row_data は ["2026/11/04 10:00:00","山田","法人"] のような JSON の形で本文に入ります。
4. サービス連携を付ける
「トリガー」タブの「サービス連携を追加」で Google Sheets の接続を選び、「どうなったら動かすか」で「New Rows in Google Sheet」(GOOGLESHEETS_NEW_ROWS_TRIGGER)を選びます。「絞り込み」の spreadsheet_id に ID を入れ、sheet_name に回答のシート名を入れます。
動かないとき
Apps Script の実行が 404 で失敗する
シークレットの無い呼び出しは 404 になります。スクリプト プロパティの名前と値を確認し、シークレットを控え損ねたときは外部トリガーを作り直します。
Slack の本文が空か、ステップが失敗する
本文の項目名と、コードが送る項目名を揃えます。送っていない項目を本文に書くと「$ref '…' の値がありません」で失敗します。
回答シートの道で通知が遅い
見に行く方式なので最大 15 分遅れます。遅れで困るときは Apps Script の道に変えます。
回答しても Apps Script が動かない
エディタの実行の記録(Executions)を開き、失敗の内容を確認します。Google の資料によると、許可していないサービスを使うとトリガーの実行はすぐに失敗します。また、別のアカウントが作ったトリガーは自分の画面に表示されないので、作った人に確認します。
よくある質問
Slack の Webhook を Apps Script から直接呼ぶのと何が違いますか
直接呼べば Samurai App は要りません。ワークフローを挟むと、失敗の記録が「最近の実行」に残り、「カテゴリ分類」で問い合わせの種類を分けるなど、通知の前に処理を足せます。
回答者のメールアドレスも送れますか
フォームでメールアドレスを収集している場合だけ、e.response.getRespondentEmail() で取得できます。Slack のチャンネルの全員に見えるので、載せるかどうかを先に決めてください。