Google Sheets(スプレッドシート)からSlackへのメッセージ送信をスケジューリングする方法

2022/09/04に公開

みなさんは普段 Google Sheets(以下スプレッドシートとする)を使ってどんな情報を管理されていますか?

利用用途はスケジュール管理やプロジェクトの課題管理など多岐にわたります。ただ、そういったスプレッドシートで管理される情報はストック情報になるため、場合によっては存在を忘れられてしまい化石化するケースもめずらしくありません。

今回この記事ではそういったスプレッドシートのストック情報をフロー情報として Slack へ特定のタイミングで送信する方法を紹介します。
利用ケースとしては以下のようなシーンで活用いただけます。

  • 営業リストからアポ取りのリマインドを自動通知
  • プロダクト公開もしくは納品前に関係者へ自動通知
  • 数字目標の達成有無を自動通知

やりたいこと

今回作成するツールの要件は以下になります。

  • あらかじめスプレッドシートに登録した通知日と今日の日付がマッチする内容を Slack の特定チャンネルへポストする
  • 登録した日付と合う情報がないか毎日定期的に自動で確認する
  • シートに登録する情報は通知日、タイトル、内容、URLとする

最終的に以下動画のようにスプレッドシートから Slack へ必要な情報を送信できることを目指します。(動画では手動送信していますが、送信タイミングは自由に設定できるようになります。)
https://www.youtube.com/watch?v=0N-3Wr9SmBU

利用条件

基本的に Google アカウントと Slack のアカウントがあれば利用いただけます。

  • スプレッドシートの作成
  • Slack ワークスペースの作成もしくは既存ワークスペースへの参加
  • gas-sheets2slackの使用(※カスタマイズする場合)

1. Slack の設定

Slack へメッセージ送信する手法として送信用のアプリを作成し、スプレッドシートの情報をそのアプリ経由で特定チャンネルへポストしたいと思います。仕組みの詳細は以下参考リンクを参照ください。

https://qiita.com/kshibata101/items/0e13c420080a993c5d16

以下リンクをクリックし、Create an Appを選択します。
https://api.slack.com/apps

Slack Create an App

From scratchを選択します。
Slack From scratch

アプリの表示設定を行います。
Slack アプリの表示設定

管理画面の左サイドバーからIncoming Webhooksを選択し、ONにして有効化します。
有効化したチャンネルのWebhook URLをコピーし、保存しておいてください。
Slack Incoming Webhooks

2. スプレッドシートの設定

まず新規でシートを作成します。
シート名はSheet1と入力し、項目名は以下のように設定してください。2 行目以降の内容は自由に設定してください。

通知日 タイトル 内容 URL
2022/09/15 Zenn エンジニアのための情報共有コミュニティ https://zenn.dev/
2022/09/20 DEV DEV Community 👩‍💻👨‍💻 https://dev.to/

スプレッドシート作成

メニューの拡張機能 > Apps Script を展開します。

3-A. 開発テンプレ(gas-sheets2slack)を利用しない場合

ひとまず動作を確認してみたいという方は以下に Apps Script(GAS)のサンプルコードを用意しているので利用してください。ローカル環境でコードを編集したい場合、この操作は不要です。

<SLACK_WEBHOOK_URL>となっている箇所に先ほど取得したWebhook URLを貼り付けます。もしシート名を変更したい場合はSheet1となっている箇所を合わせて変更してください。

function main() {}
(() => {
  "use strict";
  var e,
    t,
    a,
    n = {
      874: (e, t) => {
        (t.__esModule = !0),
          (t.createMessage = void 0),
          (t.createMessage = function (e, t, a) {
            return (
              "\n  タイトル: " + e + "\n  内容: " + t + "\n  URL: " + a + "\n  "
            );
          });
      },
      681: (e, t) => {
        (t.__esModule = !0),
          (t.postMessage = void 0),
          (t.postMessage = function (e) {
            if ("" !== e) {
              var t = { text: e },
                a = {
                  method: "post",
                  contentType: "application/json",
                  payload: JSON.stringify(t),
                };
              UrlFetchApp.fetch("<SLACK_WEBHOOK_URL>", a);
            }
          });
      },
      184: (e, t) => {
        (t.__esModule = !0),
          (t.checkSameDate = void 0),
          (t.checkSameDate = function (e, t) {
            return (
              e.getFullYear() === t.getFullYear() &&
              e.getMonth() === t.getMonth() &&
              e.getDate() === t.getDate()
            );
          });
      },
    },
    o = {};
  function r(e) {
    var t = o[e];
    if (void 0 !== t) return t.exports;
    var a = (o[e] = { exports: {} });
    return n[e](a, a.exports, r), a.exports;
  }
  (r.g = (function () {
    if ("object" == typeof globalThis) return globalThis;
    try {
      return this || new Function("return this")();
    } catch (e) {
      if ("object" == typeof window) return window;
    }
  })()),
    (e = r(184)),
    (t = r(681)),
    (a = r(874)),
    (r.g.main = function () {
      var n = new Date(),
        o = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      if (null !== o)
        for (var r = o.getLastRow() - 1, s = 0; s < r; s++) {
          var i = new Date(o.getRange(2 + s, 1).getValue()),
            g = o.getRange(2 + s, 2).getValue(),
            c = o.getRange(2 + s, 3).getValue(),
            u = o.getRange(2 + s, 4).getValue();
          if ((0, e.checkSameDate)(n, i)) {
            var l = (0, a.createMessage)(g, c, u);
            (0, t.postMessage)(l);
          }
        }
    });
})();

上記コードを Apps Script のmain.gsファイルへコピペします。
試しに Apps Script のメニューにある実行を押下してみましょう。指定したチャンネルにメッセージが送られていれば OK です。
Apps Script 実行

3-B. 開発テンプレ(gas-sheets2slack)を利用する場合

Apps Script(GAS)のコードをカスタマイズしたい場合は左ナビの「プロジェクトの設定」からスクリプト ID を確認し、保存しておきます。

リポジトリのクローン

以下リポジトリへアクセスし、Use this template を選択してください。
https://github.com/Kazuki-tam/gas-sheets2slack
テンプレート複製方法

リポジトリのセットアップが完了したら、クローンします。YOUR-USERNAMEYOUR-REPOSITORYを書き換えて使用してください。

git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY

パッケージのインストール

依存関係のあるパッケージをインストールします。

yarn install

ログイン認証

Apps Script(GAS) をローカル環境でカスタマイズできるよう、clasp という CLI ツールを利用します。
以下コマンドで Google のアカウント認証を行います。

yarn clasp login

https://github.com/google/clasp

初期設定

.clasp.jsonファイルをプロジェクトのルート直下に作成します。
<SCRIPT_ID>を先ほど取得したものと差し替えてください。

{
  "scriptId": "<SCRIPT_ID>",
  "rootDir": "./dist"
}

次に.envファイルをプロジェクトのルート直下へ作成します。
<SLACK_WEBHOOK_URL>を Slack の管理画面で取得した Webhook URL と差し替えてください。

SLACK_WEBHOOK_URL=<SLACK_WEBHOOK_URL>

プロジェクトのデプロイ

最後に以下コマンドでリモートの Apps Script(GAS) 環境へデプロイします。

yarn deploy

次のコマンドで Apps Script(GAS) 環境をブラウザで開くことができます。実際にコードがデプロイされているか確認してみましょう。

yarn open

Apps Script(GAS) のメニューにある実行を押下してみましょう。指定したチャンネルにメッセージが送られていれば OK です。
Apps Script 実行

4. 定期実行の設定

作成したスクリプトが毎日定期実行される設定を行います。
Apps Script(GAS) の左サイドバーからトリガーを選択し、トリガーを追加します。

トリガーの内容は以下のように設定します。

  • 実行する関数を選択: main
  • イベントのソースを選択: 時間主導型
  • 時間ベースのトリガーのタイプを選択: 日付ベースのタイマー
  • 時刻を選択: 送信したい時間帯(※1 時間の幅があります)

GAS 定期実行の設定

5. テスト

指定した日付と時間帯にメッセージが Slack へ送信されるか実際に確認してみましょう。

まとめ

スプレッドシートの情報を Slack へ送信できると組織内での情報共有の質を向上できたり、適切なリマインドにより人的ミスを削減することにも繋がるかと思います。今回用意した開発テンプレ(gas-sheets2slack)を利用いただくと要件に応じた Apps Script(GAS) のカスタマイズもしやすくなるのでぜひ今後も使ってみてください。

Discussion