Notionのデータベースの特定の列をチェックして、Slackにリマインドするツールを作ったので解説と、そのテンプレを公開しておきます。
テンプレ
解説
アーキテクチャ
環境
使用言語: TypeScript
プラットフォーム: Google Apps Script
デプロイツール: Clasp
気づき・落とし穴
⚠ import / export を使うときは、namespace
を使う
GASはV8エンジンに対応しているので、ES6の記法は基本的に使えるものが多いですが、 import / export
は対応していません*1。
じゃあファイル分割できないやん!というわけでもなく、namespaceを使えば一応ファイル分割して別ファイルからモジュールをimportできます。
(日本語解説) Google Apps Scriptのモダンな開発環境は理想だった - ファイル分割するとimport/export使えない問題
(公式) clasp/typescript.md at master · google/clasp - Modules, exports and imports
⚠ pushするファイルの順番に注意
GASではファイルが上から読まれます。
なので、グローバル変数・関数は呼び出し元より先になるようにpushしなければなりません。
Claspでは、.clasp.json
のfilePushOrder
でpushするファイルの順番を保証してあげたほうがいいでしょう(指定しなければアルファベット順?)
🔔 指定しなければ、一番最後にpushされるので、
main.ts
は指定してません。
"filePushOrder": [
"src/Constants.ts",
"src/Convert.ts",
"src/NotionApi.ts",
"src/SlackApi.ts"
]
Google Apps ScriptのV8 Runtime対応を検証してみた – 🌴 officeの杜 🥥
(公式) google/clasp: 🔗 Command Line Apps Script Projects
⚠ npmパッケージは使えないと思ったほうがいい
今回、NotionAPIを利用するにあたってnotion-sdk-jsを使おうとしていたのだが、webpackやbabelでゴリゴリに構成しなければなりません。
ちゃんと構成すれば使えるnpmパッケージもあるのですが、NotionSDKの場合は使えませんでした。
Google Apps Scriptのモダンな開発環境は理想だった - npmライブラリが種類によってGASでは動かない問題
じゃあdotenvを使いたいときはどうすればいいのか、後述します。
環境変数・アクセストークンの管理について
先述の通り、npmパッケージが使えない(今回は使わない)のでdotenv
が使えません。
とはいえ、Notion、Slackのアクセストークンをソースコードに直接書くわけにもいきません(Githubなどに公開できません)
しかし大丈夫です。GASには、スクリプトプロパティという仕組みで環境変数を呼び出せます。
👍 TypeScriptはそのまま書ける
TypeScriptはそのまま書けます。
clasp push
でpushするときに、claspがトランスパイルしたものをpushしてくれます。神
使い方・事前準備
事前準備
1. SlackのIncoming Webhookを設定する
2. NotionToken,DatabaseIDを取得する
NotionTokenの取得
インテグレーションを作成すると得られる、Internal Integration Token
がアクセストークンです
DatabaseIDの取得
Databaseの共有リンクにあります。
https://www.notion.so/myworkspace/a8aec43384f447ed84390e8e42c2e089?v=...
|--------- Database ID --------|
(公式) Getting started - Step 2: Share a database with your integration
3. スクリプトプロパティに1,2で取得したトークン、DatabaseID、webhook urlを設定する
4. Notionの列名を指定する
🔔 ここからはコード依存なので、自身で要件や業務仕様に合わせて実装して構いません。
src/main.ts
に、チェック対象となるNotionの列名を指定します。
displayColumnName
は終了する対象の表示名です。
例
こういうデータベースを作ったとしたら
displayColumnName
に契約名
targetColumnName
に契約終了日
を2021/12/1に実行すると、
Test契約の終了日まで23日です
と出力されます
/** 監視対象の表示名 */
const displayColumnName = '契約名'
/** 監視対象の列名 */
const targetColumnName = '契約終了日'
実行する
こんな感じで通知されます