Slackワークフローのフォーム回答をGoogleスプレッドシートへ転記するには、ワークフロービルダーのGoogleスプレッドシートのステップを使います。用意されているのは行の追加・選択・更新・削除の4種類で、転記先のシートに列名があれば、コードを書かずに回答を1行ずつ記録できる仕組みです。この記事では、slack ワークフロー スプレッドシート 連携の設定手順と、日時が9時間ずれる理由、承認結果を同じ行へ書き戻す設計、権限エラーの直し方を、Slack公式ヘルプの記述に沿って説明します。後半では、ビルダーだけでは組めない「シートの変更をSlackへ通知する」処理をGASで実装するコードと、Sheets APIで書き込む構成を示します。
まとめ:Slackワークフローとスプレッドシートの転記は4ステップで組めるかを先に確かめる
フォームの回答を行として足すだけなら、ワークフロービルダーの「Add a spreadsheet row」で済みます。承認ボタンの結果を同じ行に書き戻す場合も、一意な申請IDを列に持たせれば「Update a spreadsheet row」でノーコードのまま組めます。
つまずきやすいのは3か所です。日時はUTC+0で書き込まれて調整できず、列名のないシートには送れず、ステップは既定で作成者のGoogleアカウントで動きます。
シート側の変更をきっかけにSlackへ通知したい場合は、ビルダーの外の仕組みが要ります。GASの時間主導型トリガーからWebhookトリガーのURLへPOSTする構成が、追加費用のかからない現実的な選択肢です。
Slackワークフローで使えるGoogleスプレッドシートの4ステップと利用条件
ワークフローそのものの作り方(トリガー・フォーム・分岐・変数)はSlackワークフローの作り方:フォーム・条件分岐・変数・Webhookの設定で扱っています。ここでは、スプレッドシートと接続するステップに絞ります。
行の追加・選択・更新・削除の4ステップで指定する入力項目の違い
Slack MarketplaceのGoogle Sheets for Workflow Builderは、ワークフローで使えるステップとして次の4つを挙げています。入力項目は、開発者向けのupdate_spreadsheet_rowのリファレンスなど、同名のコネクタ関数の定義から整理しました。
| ステップ | 行の決め方 | 主な入力 | 後ろへ渡す値 |
|---|---|---|---|
| Add a spreadsheet row | 末尾の空の行 | シートと列ごとの値 | 追加した行の値 |
| Select a spreadsheet row | 列名とセルの値で探す | 照合する列と値 | 列の値と行番号 |
| Update a spreadsheet row | 列名とセルの値で探す | 照合する列と更新値 | 列の値 |
| Delete a spreadsheet row | 列名とセルの値で探す | 照合する列と値 | シートのURL |
追加以外の3つは、どれも「どの列に、どの値が入っている行か」で対象を決めます。照合に使う列の値が重複すると狙った行に当たらないため、行を後から触る運用では一意なキーの列が必須になります。
有料プラン限定でGoogleアカウントを1つだけ接続できる利用条件
ワークフロービルダーでGoogleスプレッドシートを使用するによると、この機能は有料プランで使えます。ワークフロービルダー自体が有料プラン限定なので、フリープランのワークスペースでは試せません。
Slackに接続できるGoogleアカウントは一度に1つです。別のアカウントのスプレッドシートへ書き込むときは、ステップのアカウント情報の横にある「変更」から切り替えます。ステップの一覧に項目が出ない場合は、オーナーか管理者がステップの利用を制限している可能性があります。
フォームの回答をスプレッドシートへ行の追加で転記する設定手順
1行目に列名を書いた転記先のシートを用意してから行の追加を置く手順
先にスプレッドシートを作り、1行目に「申請ID」「申請者」「品目」「金額」「申請日時」のような列名を入れておきます。そのうえで、ワークフローに次の順でステップを置きます。
- フォームのステップで、記録したい項目を質問として作る
- ステップライブラリで「Add a spreadsheet row」を選び、初回は「接続」からGoogleアカウントを連携する
- スプレッドシートとシートをドロップダウンで選ぶ
- 表示された列ごとに、書き込む値を設定して「保存」を押す
列名は、シートの1行目から読み込まれます。後から列を足したときは、ステップを開き直して新しい列に値を割り当ててください。
変数の挿入でフォームの回答と送信者の情報を列へ割り当てる設定
各列の値には固定の文字も入れられますが、通常は「変数を挿入する」からフォームの回答を選びます。回答のほか、ワークフローを使用した人やワークフローを開始した時刻も変数として選べます。
申請者の列は、表示名よりメールアドレスで残すほうが後の集計で困りません。表示名は本人が変えられるため、月次で人ごとに件数を数えると別人に分かれることがあります。
UTC+0で書き込まれる日時を日本時間に直す補助列と数式の作り方
公式ヘルプには、スプレッドシートに追加される日時はUTC+0で、タイムゾーンは現時点で調整できないと書かれています。日本時間との差は9時間です。
書き込まれた値が日時として認識されている列なら、隣に補助列を作り、=IF(E2="","",E2+TIME(9,0,0))のように9時間を足します。ワークフローが書く列そのものに数式を入れないでください。行の追加は空の行にだけ書き込むため、数式の入ったセルがあると書き込み位置がずれます。
承認ボタンの結果を同じ行へ書き戻す行の更新ステップの設定と組み方
申請IDの列で行の選択と更新の対象を1行に決める照合キーの設計
申請と承認を1行で管理するなら、ステップの並びは「フォーム、Add a spreadsheet row、ボタン付きメッセージ、Update a spreadsheet row」です。更新のステップでは、照合する列に申請IDを指定し、更新する列に承認者と承認日時を割り当てます。
開発者向けの定義では、更新値は列番号をキーにした組で渡し、列番号は0から数えます。ビルダーの画面では列名で選びますが、定義上は列の位置で値を扱います。運用を始めた後に列を挿入したり並べ替えたりしたら、ステップを開いて割り当てを確かめ直してください。
開始時刻を照合キーにする方法が同時申請で崩れる理由と代わりの値
ワークフローの開始時刻を照合キーにする手順を紹介する解説もあります。ただ、時刻は秒単位で表示されることが多く、2人が同じ秒に申請すると同じ値の行が2つできます。公式の定義には、複数の行が一致したときにどの行を対象にするかが書かれていません。
結論として、時刻ではなく重ならない値を照合に使います。ビルダーだけで済ませるなら、フォームに伝票番号のような一意の入力を求めるか、申請者のメールアドレスと時刻を連結した文字列を申請IDの列に書き込みます。採番まで自動にしたいなら、後述のGASかAPIの領域です。
権限・列名・書式で起きるスプレッドシート転記のエラーと対処の手順
スプレッドシートが候補に出ないときにGoogle側の許可を取り直す手順
Googleスプレッドシートのエラーのトラブルシューティングは、ドロップダウンに目的のスプレッドシートが出ない場合、Googleアカウントの設定でSlackのアクセス権をいったん外し、接続し直す手順を案内しています。
許可の画面では、Googleドライブのファイルの表示とダウンロード、スプレッドシートの表示・編集・作成・削除の2つにチェックが入っていることを確かめます。どちらかを外したまま続行すると、候補に出ない状態が続きます。
組織が管理するGoogleドライブで、新規作成はできるのに既存のシートを読めない場合は、Google WorkspaceでドライブのSDK APIが無効になっている可能性があります。この設定は利用者側では変えられず、Google Workspaceの管理者に依頼する案件です。
列名のないシートと書式付きセルで書き込み位置がずれる失敗と対処
列名のないシートを選ぶと「スプレッドシートの読み込み中に問題が発生しました」と表示されます。Slackは列名の無いシートへ送れないためで、1行目に列名を入れれば列と値の欄が表示されます。
見落としやすいのが書式です。公式ヘルプによると、書式設定済みのセルやドロップダウンを含むシートでは、データは書式設定された最後のセルの直下の空の行に追加されます。1,000行目まで罫線やプルダウンを先に引いておくと、1,001行目から記録が始まります。書式はデータが入ってから条件付き書式で付けるほうが安全です。
作成者のGoogleアカウントで書き込むときに広がる編集権限の範囲
ワークフローを開始するメンバーにもGoogleとの連携が求められますが、ステップは既定で作成者のアカウントを使います。この場合、利用者は自分に編集権限の無いシートにも、作成者の権限で行を足せます。
権限が制限されたシートへ送るとエラーの通知が届くため、つい作成者のアカウントに寄せがちです。全社に公開するワークフローでは、書き込み先を記録専用のスプレッドシートに分け、作成者のアカウントから他の業務シートが見えない構成にしてください。
スプレッドシートの変更をGASからWebhookでSlackへ通知する実装
ここまでは「Slackからシートへ」の向きでした。逆に、シートに行が増えたときや状態の列が変わったときにSlackへ知らせる処理は、ワークフロービルダーのステップだけでは組めません。GASから、Webhookで開始するワークフローを呼び出します。GASの基本はGAS(Google Apps Script)とは?できること・制限・始め方を参照してください。
Webhookトリガーのワークフローに変数を定義してURLを発行する設定
Slack外部で開始されるワークフローを作成するによると、Webhookのワークフローには最大20個の変数を定義でき、型はチャンネルID・ユーザーID・ユーザーのメール・テキストの4つです。ネストしたJSONは使えません。定義した変数が送られてこないと、ワークフローは失敗します。
公開するとhooks.slack.com/triggersで始まるURLが発行されます。リンクを持つ人なら誰でも起動できるため、URLの保存先は、コードへの直書きではなくGASのスクリプトプロパティです。Webhookのワークフローは1秒に1リクエストまでという制限もあります。決めたチャンネルへ投稿するだけで後続の処理が要らないなら、Slack Incoming Webhookの実装手順で足ります。
GASのUrlFetchAppで1分ごとに未通知の行をPOSTするコード例
次のコードは、シート「log」の未通知の行を探し、Webhookの変数 request_id・applicant・summary として送ります。列の並びは前の章の申請ID・申請者・品目・金額・申請日時に「通知日時」を6列目として足した形で、送れた行には6列目に日時を書くことで、二重送信を防ぐ仕組みです。送信にはUrlFetchAppを使い、muteHttpExceptionsを付けて失敗時も応答を受け取ります。
// スクリプトプロパティ SLACK_WEBHOOK_URL に Webhook トリガーの URL を保存しておく
function notifyNewRows() {
const url = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
const sheet = SpreadsheetApp.getActive().getSheetByName('log');
const rows = sheet.getDataRange().getValues();
for (let i = 1; i < rows.length; i++) {
const [requestId, applicant, item, amount, requestedAt, notifiedAt] = rows[i];
if (!requestId || notifiedAt) continue; // 空行と通知済みの行は飛ばす
const res = UrlFetchApp.fetch(url, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify({
request_id: String(requestId),
applicant: String(applicant),
summary: item + ' ' + amount + '円',
}),
muteHttpExceptions: true,
});
if (res.getResponseCode() !== 200) {
console.error(res.getResponseCode(), res.getContentText());
break; // 失敗したら次回の実行で同じ行から再送する
}
sheet.getRange(i + 1, 6).setValue(new Date()); // 6 列目(通知日時)に記録する
Utilities.sleep(1100); // Webhook のワークフローは毎秒 1 リクエストまで
}
}
// 初回に 1 度だけ手動で実行し、1 分ごとの時間主導型トリガーを作る
function installTrigger() {
ScriptApp.newTrigger('notifyNewRows').timeBased().everyMinutes(1).create();
}
installTriggerを手動で実行すると、UrlFetchAppとスプレッドシートへのアクセスの承認を求められます。スクリプトに付与するOAuthスコープと公開範囲の決め方はGASのセキュリティ|OAuthスコープ・公開設定・管理者統制の実務で整理しています。
ワークフローが書き込んだ行ではGASの編集トリガーが動かない制約
行が増えたら即座に通知したいと考え、編集時に動くトリガーを使いたくなります。ところが、Apps Scriptのインストール可能なトリガーの説明では、編集トリガーはユーザーがシートの値を変えたときに動き、スクリプトの実行とAPIリクエストではトリガーが動かないとされています。
Slackのワークフローは外部からシートに書き込むため、この制限に当たると考えて設計してください。上のコードが編集トリガーではなく1分ごとの時間主導型トリガーで未通知の行を拾っているのは、この理由からです。人がシートを直接編集したときだけ通知すればよい用途なら、編集トリガーで足ります。
ビルダーで足りない転記をSheets APIで書き込む構成と外へ出す判断
Sheets APIのvalues.appendで行を末尾に追加するリクエスト例
Slackアプリや社内システムから直接シートに書き込むなら、spreadsheets.values.appendを呼びます。範囲で指定した表の最後の行の後に値が追加され、insertDataOption=INSERT_ROWSなら新しい行を挿入して書き込みます。
curl -X POST \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
"https://sheets.googleapis.com/v4/spreadsheets/${SPREADSHEET_ID}/values/log:append?valueInputOption=USER_ENTERED&insertDataOption=INSERT_ROWS" \
-d '{"values":[["REQ-20261107-0001","U0123ABCD","備品購入","12000","2026-11-07 10:15:00"]]}'
認可スコープは spreadsheets・drive・drive.file のいずれかが必要です。サービスアカウントで動かす場合は、そのアカウントのメールアドレスを対象のシートに編集者として共有しておきます。日時を日本時間の文字列で書けるので、ビルダーで起きる9時間のずれはこの経路では起きません。Slack側のイベントの受け方はSlack APIとは?Web API・Events API・Boltの違いにまとめています。
ノーコードで続けてよい条件とGAS・iPaaS・受託開発へ移す判断基準
ノーコードのまま続けてよいのは、次の条件をすべて満たすときです。向きがSlackからシートへの一方向であること、1回の申請で書く行が1行であること、そしてシートが記録専用で人が並べ替えや列の挿入をしないことです。この範囲なら、GASもAPIも持ち込む理由がありません。
シートからSlackへの通知や、申請IDの自動採番が要るならGASに出します。保守は小さく済みますが、インストール可能なトリガーは作成した人のアカウントで動きます。作成者の退職でアカウントが止まれば通知も止まるため、部署で管理するアカウントでトリガーを作る取り決めが前提です。kintoneや会計システムなどシート以外にも同じデータを流したくなった時点で、スプレッドシートを中継に使い続けるのはやめるべきです。行の照合が増えるほど、どこで値が食い違ったか追えなくなります。
その段階では、ZapierやMakeなどのiPaaSで組むか、Slackと業務システムを直接つなぐ開発に切り替えます。一創では、Slackのワークフローや既存システムを前提にしたAPI開発・システム連携の設計と実装を受けています。
よくある質問
Slackワークフローとスプレッドシートの連携で、検索の多い質問に答えます。
Slackワークフローのスプレッドシート連携は無料プランで使えますか?
使えません。Googleスプレッドシートのステップは有料プランの機能で、ワークフロービルダー自体も有料プランでのみ利用できます。フリープランのまま記録を残したい場合は、ワークフローを使わずにGASからSlackへ投稿する構成や、iPaaSの無料枠で組む方法が候補になります。ただし後者は実行回数の上限に当たりやすく、申請件数が多い部署には向きません。
スプレッドシートの行を読み取ってSlackに投稿できますか?
できます。「Select a spreadsheet row」で、指定した列が指定した値になっている行を探し、その行の列の値を後ろのステップへ渡せます。たとえばフォームで社員番号を受け取り、名簿シートから所属と内線番号を引いてメッセージに差し込む使い方です。条件に合う行を複数まとめて取り出す用途には向かないため、一覧が必要ならGASかAPIで組みます。
ZapierやMakeでつなぐ方法とワークフロービルダーはどちらがよいですか?
Slackのフォームから1行足すだけなら、追加費用のかからないワークフロービルダーで十分です。iPaaSが向くのは、Slack以外のアプリへ同じデータを渡す場合や、シートの変更を起点に処理を始めたい場合です。課金は実行回数の単位で決まり、ツールごとに数え方が違います。違いはZapierとMakeの違い|課金単位と対応アプリ数で決める選び分けの基準で比べています。
WebhookトリガーのURLが外部に漏れたらどうなりますか?
URLを知っている人なら誰でもワークフローを起動できるため、偽の申請や通知を投稿される恐れがあります。漏れた疑いがあれば、そのワークフローを止め、Webhookで開始するワークフローを作り直して新しいURLへ差し替えてください。GAS側はスクリプトプロパティの値を書き換えるだけで済みます。URLをコードやシートのセルに直接書いていると、差し替えの範囲が広がります。
スプレッドシートを使わずにワークフローの回答をまとめて取り出せますか?
取り出せます。フォームの回答はワークフロービルダーからCSVでダウンロードでき、APIで書き出す方法もあります。手順はSlackワークフローの作り方のフォーム回答の章で説明しました。月に1度の集計で足りるならCSVの書き出しで済ませ、日々の進捗を誰かが見るならスプレッドシートへの転記を選ぶ、という分け方が手間と効果の釣り合う線です。
関連記事
- Slackワークフローの業務別の使い方10例:申請・日報・問い合わせ受付の組み方と限界:スプレッドシートへの記録を組み込む業務の例と、ワークフローで足りなくなる場面
- Slack Botで自動投稿する方法:chat.postMessageの定期投稿とscheduleMessageの予約・リマインダー実装:シートの集計結果を決まった時刻にBotから投稿する実装
- iPaaSとは?仕組み・RPAとの違い・料金の数え方と導入判断をわかりやすく解説:スプレッドシートの中継をやめてツール同士をつなぐときの考え方