はじめに
Notion Tips の第166回目は昨日失敗した Webhook を再検証します。昼に行われた Notion Webhook 座談会で GAS が使えないのではという話をしていたところでした。
明日は早速Notionに実装された新機能
— モーリー | Notion公式アンバサダー🏅 (@Notion_freak) 2024年12月4日
Webhookについての座談会を行います!
ゲスト(増えるかも):@keitaro_aigc @akira_papa_IT @sora19ai
どんな機能なのかチェックしたい方は
是非リプ欄から無料チケットを確保! https://t.co/cqiJOJSPHY pic.twitter.com/FzLW2yYuEq
その後、そらさんが Notion Webhook から GAS に連携できるという話をしてくれたので、いろいろ調べたところアカウントを必要とせず、認証を伴わない「全員」にすればいいとのことでした。
Notion Webhook からGASでスプシ転送できた!
— そら ☁️ Dify 自動化オタク📱 (@sora19ai) 2024年12月5日
結構ひと癖ありますね💦
Notion Webhook のが送信しているデータがわかったんだけど、ほしい人は フォロー & いいね &「Webhook」ってリプしたら記事を送ります!🎁 https://t.co/oHxcS9vcFO pic.twitter.com/ajxti5dI57
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をコピー」としたものを上に記載してください。

ウェブアプリとしてデプロイ
このアプリを 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 をわざわざ作る必要がないのは楽ですね。

動作確認
実際にこれで動作確認しました。様子を X にポストしています。
Discord 通知が作れました。 @sora19ai さんのおかげで GAS 経由で実施しています。今はテストのためにチェックボックスですが、実際にはタスクの完了をチェック外すと、Done になり、時刻記録され、Discord に通知されます。#Notion #notintwt pic.twitter.com/MW5lSguAra
— hkob|Notion Ambassador (@hkob) 2024年12月5日
Set end time の更新
これで目的だったタスク完了時のオートメーションを更新します。

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

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