📌

Googleスプレッドシートにチェックを入れたら、同じ行の情報を含めてSlackに通知するGAS

2024/02/13に公開

この記事は何

業務管理をしているGoogleスプレッドシートの特定の列にチェックを入れたら、同じ行の特定の列の値を文言に含めてSlackに完了報告をするためのGoogle Apps Scriptやその周辺の情報です。
Googleスプレッドシートに書いた情報をSlackに転記する作業を撲滅します。
非エンジニアの私が生成AIに繰り返し質問して通知できるようになった内容をまとめました。

機能概要(例)

  • あるGoogleスプレッドシートの「シート1」でF列にチェックを入れた際に
  • キャンセル/OKのポップアップが表示され
  • 「OK」をクリックすると
  • 任意のSlackチャンネルに「シート1」のB列の情報を含めて
  • 決まったメンバー(またはユーザーグループ)にメンションする

補足

  • 別シートのF列にチェックを入れても何も起こらない
  • F列からチェックを外しても何も起こらない
  • ポップアップで「キャンセル」をクリックしても何も起こらない

Zapierでも似たようなことはできるのですが、トリガーがセルの"更新"のため、チェックを外した時にもSlackに送信されてしまうため、GASにしました。

事前準備

SlackのチャンネルのURL(Webhook)を取得する

この辺りの記事を参考にしてください。
https://zenn.dev/hotaka_noda/articles/4a6f0ccee73a18

Slackのメンション先のIDを取得する

@namaenamae のような表示名をSlackのメッセージに指定しても、投稿された際にメンションされない(ただの文字列となる)ため、メンバーID or グループIDを取得します。

参考
https://intercom.help/yoom/ja/articles/5480063-slackのメンバー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