1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GASでNotionAPIを叩いてSlackに締め切りお知らせくん(リマインダ)を作ろう

Last updated at Posted at 2021-12-06

Notionのデータベースの特定の列をチェックして、Slackにリマインドするツールを作ったので解説と、そのテンプレを公開しておきます。

テンプレ

解説

アーキテクチャ

至ってシンプルです
image.png

環境

使用言語: 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.jsonfilePushOrderで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には、スクリプトプロパティという仕組みで環境変数を呼び出せます。

【GAS】コードにAPIトークンやIDのベタ書きを避ける(プロパティサービスの活用) - Qiita

👍 TypeScriptはそのまま書ける

TypeScriptはそのまま書けます。

clasp pushでpushするときに、claspがトランスパイルしたものをpushしてくれます。神

clasp/typescript.md at master · google/clasp

使い方・事前準備

事前準備

1. SlackのIncoming Webhookを設定する

Sending messages using Incoming Webhooks | Slack

2. NotionToken,DatabaseIDを取得する
NotionTokenの取得
インテグレーションを作成すると得られる、Internal Integration Token がアクセストークンです
2ec137d-093ad49-create-integration.gif

(公式) Getting started - Step 1: Create an integration.

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を設定する
image.png

4. Notionの列名を指定する

🔔 ここからはコード依存なので、自身で要件や業務仕様に合わせて実装して構いません。

src/main.tsに、チェック対象となるNotionの列名を指定します。
displayColumnNameは終了する対象の表示名です。


こういうデータベースを作ったとしたら
image.png
displayColumnName契約名
targetColumnName 契約終了日
を2021/12/1に実行すると、
Test契約の終了日まで23日ですと出力されます

/** 監視対象の表示名 */
const displayColumnName = '契約名'
/** 監視対象の列名 */
const targetColumnName = '契約終了日'

実行する

GAS側でdoPost関数を実行します。
image.png

こんな感じで通知されます

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?