📌
Googleスプレッドシートにチェックを入れたら、同じ行の情報を含めてSlackに通知するGAS
この記事は何
業務管理をしているGoogleスプレッドシートの特定の列にチェックを入れたら、同じ行の特定の列の値を文言に含めてSlackに完了報告をするためのGoogle Apps Scriptやその周辺の情報です。
Googleスプレッドシートに書いた情報をSlackに転記する作業を撲滅します。
非エンジニアの私が生成AIに繰り返し質問して通知できるようになった内容をまとめました。
機能概要(例)
- あるGoogleスプレッドシートの「シート1」でF列にチェックを入れた際に
- キャンセル/OKのポップアップが表示され
- 「OK」をクリックすると
- 任意のSlackチャンネルに「シート1」のB列の情報を含めて
- 決まったメンバー(またはユーザーグループ)にメンションする
補足
- 別シートのF列にチェックを入れても何も起こらない
- F列からチェックを外しても何も起こらない
- ポップアップで「キャンセル」をクリックしても何も起こらない
Zapierでも似たようなことはできるのですが、トリガーがセルの"更新"のため、チェックを外した時にもSlackに送信されてしまうため、GASにしました。
事前準備
SlackのチャンネルのURL(Webhook)を取得する
この辺りの記事を参考にしてください。
Slackのメンション先のIDを取得する
@namaenamae のような表示名をSlackのメッセージに指定しても、投稿された際にメンションされない(ただの文字列となる)ため、メンバーID or グループIDを取得します。
参考
対象のシートのIDを取得する
※ これもGASです。
function logSheetIds() {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 0; i < sheets.length; i++) {
Logger.log(sheets[i].getName() + ' - Sheet ID: ' + sheets[i].getSheetId());
}
}
保存をして、エディタ上部の「▷実行する」をクリックすると、各シートのIDが出力されるので、該当のシートのIDをメモしておきます。
通知のGAS
ファイルを作成
コメントアウトを参考に適宜書き換えてください。
// SlackのWebhook URL
// URL部分を取得したwebhookのURLと差し替えてください
var SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/xxxxx/xxxxx/xxxxxxx";
// F列が編集されたときの関数
// 「onEditF」を書き換える場合、後述のトリガー「実行する関数を選択」も合わせる
function onEditF(e) {
var sheet = e.range.getSheet();
// シートのIDが特定のIDでなければ何もしない
// シート名が変更されることを考慮して、IDを指定します
// 取得したIDをsheet_idと差し替える
if(sheet.getSheetId() !== sheet_id) return;
var range = e.range;
var column = range.getColumn();
var value = range.getValue();
// F列が編集されない場合は何もしない
if (column !== 6) return;
// セルの値がtrueでない場合は何もしない
if (value !== true) return;
// B列の値を取得する
// 「-4」は起点となるF列から何列戻る(進むか)を表している。C列の場合は「-3」、G列の場合は「1」
var bValue = range.offset(0, -4).getValue();
if (!bValue) return;
// メッセージにB列の値を含める
var message = "「" + bValue + "」の完了をSlackに通知しますか?";
// ポップアップでユーザーの承認を確認する
var ui = SpreadsheetApp.getUi();
var response = ui.alert(message, ui.ButtonSet.YES_NO);
// ユーザーが「はい」を選んだ場合のみ処理を続行する
if (response !== ui.Button.YES) return;
// Slackにメッセージを送信する
notifyToSlack(club, eValue);
}
// Slackにメッセージを送信します
function notifyToSlack(club, eValue) {
// 取得した通知先のIDを memberid と差し替える
// ユーザーグループの場合、<!subteam^xxxxxx> とする ※ @も不要
// 参考 https://note.com/0375/n/nf678ff448216
var message = <@memberid> + "「" + bValue + "」を完了しました。 ";
var payload = {
"channel" : "#salon-integration-test",
"text" : message,
};
var options = {
"method" : "post",
"contentType" : "application/json",
"payload" : JSON.stringify(payload)
};
UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
}
トリガー
こんな感じで!
Discussion