🐤

Slackワークフロー✖️Notion API✖️GASでSlackからNotionに未確認の依頼をリスト化する

2023/04/28に公開

きっかけ

タスクをたくさん抱えて忙しい時に限ってSlackの複数のチャンネルで新たな依頼が(容赦なく)降りかかってくる・・というのは情シスではよくあることで、時間が経つにつれスレッドが流れてしまうこともあります。
そこで、依頼に気づいたタイミングでその内容をとりあえずSlack上で簡潔に入力するだけでNotionにリスト化できれば、あとで確認しやすいかなと考えました。

必要なもの

  • Notion
  • Googleスプレッドシート
  • Slack

概要

特定のチャンネルで特定の絵文字でリアクションすると入力フォームが開き、そこで依頼の概要(メモ)やスレッドのURLを入力します。
入力したデータの流れとしてはSlack発→Googleスプレッドシート経由→Notion着のようなイメージになりますが、作業は逆からNotion→Googleスプレッドシート→Slackの順で設定していきます。

作業手順

Notion

1. データベースを作成(プロパティとブロック項目)

見える形のものがあると作業しやすい(気がする)ので最初に作ります。
親オブジェクトのプロパティはシンプルな構成にしました。名前とプロパティタイプは以下の通りです。

  • 依頼の概要:タイトル(title DBでは必須のプロパティなのでこれを使ってます)
  • SlackのURL:URL(URL
  • 状態:セレクト(Select ここはデフォルト:未対応で固定)
  • 最終更新日:関数(Formula
    →非表示にしているプロパティ Last edited time をFormatdate関数で参照し表示形式を変更

子オブジェクトには、あとで見直すとき経緯などの情報や資料をまとめておけるように定型的に使いそうな項目を箇条書きのブロックとして配置しています。

  • 経緯・状況
  • ファイル

2. インテグレーションを作成

下記サイトでインテグレーションを作成します。
https://www.notion.so/my-integrations
入力あるいは選択した項目だけ書き出してみました。

  • Basic Information

    • Name(必須)
    • Logo(任意 入れる場合は512px x 512pxのPNGファイル)
    • Associated Workspace(必須)

    →ここまできたら Submit→ (変更時は Save changes )をクリック

  • Capabilities(以下は選択した項目)

    • Content Capabilities
      • Read content
      • Update content
      • Insert content
    • User Capabilities
      • Read user information including email addresses

    →ここまできたら Save changes をクリック

  • Secrets

最後にトークンをメモ帳などにコピペしておきます。(後で使います)
右横にある Show をクリックするとトークンの文字列が表示され、今度はその右横に Copy が表示されるのでそこをクリックするとコピーできます。

3. データベースにインテグレーションを追加

作成したデータベースに戻って右上の3点リーダーから[コネクトの追加]をクリックし、さきほど作成したインテグレーションの名前を検索して選択します。

連携を許可するか聞かれるので[はい]をクリックします。

Googleスプレッドシート

4. 経由するスプレッドシートを作成

適当な名前でスプレッドシートを作成します。(作成するスプレッドシートはGoogleドライブのマイドライブに保存するようにしてください)
1行目は列を識別するためのカラム名を入力します。
Slackから入力するのはSlackでの「依頼の概要」と「Slackの(スレッドの)URL」の2項目だけにしたいので、

  • A列:request
  • B列:slackurl

としました。

5. GASを作成(スクリプト)

次に、スプレッドシートの[拡張機能]タブから[Apps Scrypt]をクリックしてGASのエディタを開き、スクリプトを書きます。

こちらはNotionAPIのバージョン 2022-06-28 に対応しています。
以下のスクリプト内にある下記文言の部分は置き換えが必要になります。

  • "ここにNotionのトークンを入れる"
    上記「2.インテグレーションを作成」でコピーしたトークンをダブルクォーテーションの中に入れます。
  • "ここにNotionのDatabaseIDを入れる"
    データベースIDはデータベースのURL https://www.notion.so/ の後ろから、URLの真ん中から少し後ろぐらいにある ?v= の手前までの文字列になります。それをダブルクォーテーションの中に入れます。
function RequestStock() {

  const stockSheet = SpreadsheetApp.getActiveSheet();
  const latestEntryRow = stockSheet.getLastRow();
  const request = stockSheet.getRange(latestEntryRow, 1).getValue();
  const slackurl = stockSheet.getRange(latestEntryRow, 2).getValue();

  const payload = createStock(request, slackurl);
  postNotion(payload);

}


function postNotion(payload){

  const MY_NOTION_TOKEN = "ここにNotionのトークンを入れる";
  const url = "https://api.notion.com/v1/pages";
  const options = {
    "method": "post",
    "headers": {
      "Content-type": "application/json",
      "Authorization": "Bearer " + MY_NOTION_TOKEN,
      "Notion-Version": "2022-06-28",
    },
    "payload": JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options);
}


function createStock(request, slackurl){
  const DATABASE_ID = "ここにNotionのDatabaseIDを入れる";

  payload = {
    "parent": {
      "type": "database_id",
      "database_id": DATABASE_ID
    },
    "properties": {
      "依頼の概要": {
        "title": [
          {
            "text": {
              "content": request
            }
          }
        ]
      },
      "SlackのURL": {
        "url": slackurl
      },
      "状態": {
        "select": {
            "name": "未対応"
        }
      }
    },

    "children": [
      {
        "object": "block",
        "type": "bulleted_list_item",
        "bulleted_list_item": {
          "rich_text": [
            {
              "type": "text",
              "text": {
                "content": "経緯・状況"
              }
            }
          ]
        }
      },

      {
        "object": "block",
        "type": "bulleted_list_item",
        "bulleted_list_item": {
          "rich_text": [
            {
              "type": "text",
              "text": {
                "content": "ファイル"
              }
            }
          ]
        }
      }
      
    ]
  }
  return payload;

}

6. GASのトリガーをセット

トリガーはこんな感じでセットしてみました。

Slack

7. ワークフローを設定するチャンネルを作成(または決定)

ワークフローで使いたいリアクション絵文字を他のユーザーが使ってしまう可能性を考えると、できれば個人専用とか、通知専用などのメンバー&やり取りが少なめのチャンネルがいいかなと思います。

8. 必要なアプリの有無を確認

今回のワークフローではSlackのワークスペースにGoogle Sheets for Workflow Builderのアプリがインストールされている必要があります。確認するには、Slackで

サイドバー上部の[App]をクリック(見当たらない場合[その他]から[App]をクリック)
→右側にワークスペース内にあるアプリが表示される

ので、そこから探します。インストールされていない場合はこちらを参考にインストールします。(アプリのページへのリンクあり)
https://slack.com/intl/ja-jp/help/articles/11086384874259-ワークフロービルダーで-Google-スプレッドシートを使用する

9. ワークフローを設定

a. ここからSlackのワークフローを設定します。全部で4個のステップを登録します。
Slackの画面左上に書いてあるワークスペース名をクリックし、[ツール] - [ワークフロービルダー]の順にクリックしてワークフロービルダーを開きます。

b. 画面右上に表示される[作成]をクリックし、ワークフローの名前を入力したら[次へ]をクリックします。今回は Request-Stock としてみました。
(スレッドへの自動返信時に表示されるので、わかりやすい&短めの名前がおすすめです)

<ステップ1>
c. ワークフローの開始方法を指定します。「絵文字リアクション」の[選択する]をクリックします。

d. ワークフローを設定するチャンネルとリアクションで使う絵文字を指定します。
上記「7. ワークフローを設定するチャンネルを作成(または決定)」で用意したチャンネルと、ワークフローを起動するトリガーとして使いたい絵文字をそれぞれ1つずつ指定したら[次へ]をクリックします。

<ステップ2>
e. 続いて[ステップを追加]をクリックします。

f. ステップライブラリが開くので、[フォームを送信する]をクリックします。

g. フォーム送信用の設定画面が開きます。上半分の設定項目は以下のように設定します。

h. 下半分は以下のように設定します。質問は2個あり、質問以外の設定項目は

  • 質問のタイプ:どちらも「長い回答」
  • これを必須に設定:1個目の質問はON、2個目の質問はOFF

にしてあります。設定できたら[保存する]をクリックします。

<ステップ3>
i. [ステップを追加]をクリックします。

j. ステップライブラリが開くので、[Add a spreadsheet row]をクリックします。

k. Connected accountで自身のアカウントが表示されていることを確認したら、Select a spreadsheetで上記「4. 経由するスプレッドシートを作成」で作成したスプレッドシートを選択します。

l. 対象シート名を選択するとA列1行目に入力したカラム名が表示されるので、右下にある[変数を挿入する]をクリックします。

m. さきほど「h.」のところで設定した1個目の質問の内容をA列に転記したいので、変数メニューの中から回答:「依頼内容(概要)」 を選択します。

n. 質問が2個あるので、もう1列設定します。[+Add Column]をクリックします。

o. A列の設定の下に、B列1行目に入力したカラム名が表示されるので、同じように[変数を挿入する]をクリックします。

p. 今度は変数メニューの中から回答:「対象スレッドのSlackURL」 を選択します。

q. [保存する]をクリックします。

<ステップ4>
r. 最後のステップを設定します。[ステップを追加]をクリックします。

s. ステップライブラリが開くので、[メッセージを送信]をクリックします。

t. 設定画面が開くので、以下のように設定します。設定したら[保存する]をクリックします。
(正直なところつい最近まで「このステップやめようかな?」と思っていたのですが、このメッセージが飛んでこない=どこかでエラーが起きている、ということがわかったのでエラー覚知用として入れてます)

u. これでワークフローの設定は終了です。アイコンを変更する場合は、[設定]タブをクリックし「アイコン」の右側にある[編集]をクリックします。

v. [ファイルを選択する]をクリックし、アイコン画像のファイルを選択します。(アイコン画像:128px以上の正方形)

w. すべての設定が終わったら画面右上の[公開する]をクリックします。

x. 以下のメッセージが表示されたら公開完了です。

y. 設定がうまくいったか確認します。ワークフローを設定したチャンネルのどれか適当なメッセージに設定した絵文字でリアクションするとワークフローから返信が来るので、[フォームを開く]をクリックします。

z. このようなフォームが開きます。適当に入力して[Submit]をクリックします。
スレッドにワークフローからメッセージが返信されていること、フォームへ入力した内容がNotionのデータベースに入力されていることを確認できたら確認作業完了です。

参考文献

設定するとき以下の記事を参考にさせていただきました。(ありがとうございました!)
https://tech.crassone.jp/posts/stock-information-from-slack-to-notion

さいごに

依頼があった当日中に内容を確認できずにいると、スレッドが流れて行方不明・・とか、依頼があったことすら忘れていた・・!ということもあるので、リスト化できていると取りこぼしが防げるし、何よりスレッドを探さなくて済むのでストレスなく確認できるのがメリットだなと思いました。
NotionAPIやSlackのワークフローに挑戦してみたい!という方の参考になれば嬉しいです。

レスキューナウテックブログ

Discussion