こんにちは。出口です。 先日紹介したテックトーク用のSlack Botを作りました。
テックトークについては以下の記事を参照してください。
Slack Botのアーキテクチャは以下の通りです。
メインはGoogle Apps Script(GAS)です。
テックトークはNotionのデータベースで管理しています。
GASを使ってNotionのDBを読み取り、Slackに通知するものです。
TSで書いたものをVite + RollupでJSにトランスパイルしてclaspを使ってGASに反映する形にしました。
Vitestでテストも書いてます。
vite.config.jsの内容は次の通りです。
import path from "node:path"; import rollupPluginGas from "rollup-plugin-google-apps-script"; import { defineConfig } from "vite"; export default defineConfig({ plugins: [ rollupPluginGas({ manifest: { copy: true, }, }), ], build: { rollupOptions: { input: "src/index.ts", output: { dir: "dist", entryFileNames: "index.js", format: "iife", }, }, minify: false, // trueにすると関数名が消えるのでfalse必須 }, resolve: { alias: { "@": path.resolve(__dirname, "./src"), }, }, });
rollup-plugin-google-apps-script
を使っています。
トラブルシューティング
Notionのデータベースからデータが取得できない
データを取得するには、Notionのインテグレーションとデータベースを接続する必要があります。
インテグレーションはワークスペースのオーナーでないと作成出来ないので注意が必要です。
定期実行の設定が思った感じに出来ない
GASはトリガーを設定して定期実行が可能ですが、設定の最小単位が1時間なので、そのままだと決まった時間に定期実行することは出来ません。
// 毎週金曜日9時〜10時のどこかで実行される ScriptApp.newTrigger('notifyTechTalkReminder') .timeBased() .onWeekDay(ScriptApp.WeekDay.FRIDAY) .atHour(9) .create();
特定の時間を指定して1回だけ実行するトリガーの設定は可能なので、これを使って処理を実行したら、次のトリガーを設定することで無限に設定し続けるようにしました。
こんな感じです。
export function setTechTalkReminderTrigger() { deleteTrigger("executeTechTalkReminder"); const executionDate = getNextWeeklyExecutionDate(5, 9, 0); // 次の金曜日の9時を取得する ScriptApp.newTrigger("executeTechTalkReminder") .timeBased() .at(executionDate) .create(); } export function executeTechTalkReminder() { notifyTechTalkReminder(); // Notion APIでデータ取得して、Slackに通知するメソッド setTechTalkReminderTrigger(); }
まとめ
TypeScriptとGoogle Apps Scriptを組み合わせて、テックトーク管理を自動化するSlack Botを開発しました。
Notionのデータベースと連携することで、チームのナレッジ管理と通知の自動化を実現できました。
今後もフィードバックを基に改善出来たらなと思っています。
同様の課題を持つ方々の参考になれば幸いです。