Webhook で Discord 通知を作る: Notion Tips (166)

はじめに

Notion Tips の第166回目は昨日失敗した Webhook を再検証します。昼に行われた Notion Webhook 座談会で GAS が使えないのではという話をしていたところでした。

その後、そらさんが Notion Webhook から GAS に連携できるという話をしてくれたので、いろいろ調べたところアカウントを必要とせず、認証を伴わない「全員」にすればいいとのことでした。

GAS の記載

受け取れることがわかったら、早速 GAS のスクリプトを作成します。Discord は URL に JSON を送るだけでいいようです。JSON は最小で content キーにテキストを入れるだけでよいようです。keyword ですが、postData の文字列を JSON.parse した後の data の下に page block の JSON が展開される形でした。page の構成については、私の書籍を読むか、公式の page オブジェクトの解説を読んでください。今回は discord という formula の内容を文字列で取得しています。

function doPost(e) {
  let json = JSON.parse(e.postData.getDataAsString())
  let keyword = json.data.properties.discord.formula.string
  let url = "https://discord.com/api/webhooks/DiscordのWebHookのID"
  let options = {
    "method": "POST",
    "headers": {
      "Content-Type": "application/json",
    },
    "payload": JSON.stringify({"content": keyword})
  }
  console.log(options)
  return UrlFetchApp.fetch(url, options)
}

この URL は Discord のチャンネルで「連携サービス」を選択すると作成できます。「ウェブフックURLをコピー」としたものを上に記載してください。

Discord の Webhook url

ウェブアプリとしてデプロイ

このアプリを Notion の Webhook から呼べるようにするためにデプロイします。この時、自分が実行する形にすると、アクセスできるユーザが「全員」に設定できます。昨日はウェブアクセスしたユーザに設定してしまったために、アクセスできるユーザがアカウントを持っている人に限定されてしまい失敗していたのでした。これを全員にすれば動作するということを、そらさんに教えてもらい無事に呼び出せるようになりました。

新しいデプロイ

作成すると次のようにウェブアプリの URL が作成されます。ここで「コピー」として URL を記録しておきます。

ウェブアプリ

Discord 表示用プロパティの準備

今回は、タスク完了時にタスク名と開始時間・終了時間・かかった時間を Discord に記録するシステムを作成します。この文字列を作成する discord というフォーミュラを作成します。当初、すでにある Display status を表示することにしていたのですが、Formula の計算は GMT で計算されるためにいつものように 9 時間ずれてしまいました。オートメーションであれば、ローカルのタイムゾーンを取得できるのですが、今回はタイムゾーンを自動取得することはできません。今回は私だけが使うということで、9 をハードコーディングすることになりました。

lets(
    period, today().dateAdd(prop("_taskTime"), "minutes").formatDate("H:mm"),
    d, prop("Start date"),
    sd, d.dateStart().dateAdd(9, "hours").formatDate("HH:mm"),
    ed, d.dateEnd().dateAdd(9, "hours").formatDate("HH:mm"),
    times, [sd, "-", ed, "(", period, ")"].join(""),
    [prop("Task name"), times].join("\n")
)

テスト用チェックボックスの作成

今回は、webhook test というチェックボックスを用意して、簡単な動作確認をしています。チェックしたタイミングで「Webhook を送信する」を実行します。この時、必要な discord formula だけを送信します。JSON をわざわざ作る必要がないのは楽ですね。

Checkbox のテストオートメーション

動作確認

実際にこれで動作確認しました。様子を X にポストしています。

Set end time の更新

これで目的だったタスク完了時のオートメーションを更新します。

タスク完了時のオートメーション (Set end time)

テストが動いていたので、こちらも当然ながら問題なく動作しました。

ブログ執筆完了の記録

おわりに

昨日の挫折から一転して、なんとか GAS 経由で Webhook が呼び出せるようになりました。昼の座談会でいろいろと候補が出ていたので、またブログネタにいろいろと検討してみたいと思います。

hkob.notion.site