今回はGAS(Google Apps Script)に関して書いていきます。
普段からNotionをよく使っていて、GASでNotionからデータを取得するプログラムを書いてみたいなと思っていました。
今回はお試しの気持ちも含めて、以下の処理をGASで書いてみます。
- ラジオ管理Notionからデータ取得
- 取得データをGmailで通知
- GASでトリガー設定(1日1回実行)
ざっくりまとめると「GAS」×「Notion」×「Gmail」です。
それでは本題へ。
前提情報
GASとは?
Google Apps Script(GAS)は、ひとことで言えばGoogleが提供する各種サービスの自動化/連携を行うためのローコード開発(※1)ツールです。GASを使うと、Gmailやカレンダー、Googleスプレッドシート、Googleドライブなど、Googleが提供する様々なサービス上で処理を自動化したり、複数のサービスを連携させたりできます。
※1:ローコード開発:可能な限りソースコードを書かずにアプリケーションを開発する手法出典:【入門】GASとは?できること&活用法を解説(サンプルコード付き) - マーケティングオートメーションツール SATORI
詳しくは以下のサイトを見て頂ければと。
satori.marketing
Notionとは?
Notionとはアメリカ・サンフランシスコを拠点とするスタートアップ企業Notion Labsが開発した多機能ドキュメントツールです。プロジェクト管理やスケジュール管理、社内wikiなど目的に応じて使い分けられるさまざまなドキュメントを集約できるため「オール・イン・ワンツール」と呼ばれています。
出典:【万能アプリ】Notionとは?何がスゴイ?使い方や活用事例、料金などについてわかりやすく解説 - 2023/12/08 [Schoo]
詳しくは以下のサイトを見て頂ければと。
schoo.jpwww.sbbit.jp
やりたいこと
記事の冒頭でも触れましたが、やりたいことはざっくり
- ラジオ管理Notionからデータ取得
- 取得データをGmailで通知
- GASでトリガー設定(1日1回実行)
です。
ラジオ管理Notionで、よく聴くラジオ番組を曜日別に管理しています(以下画像)。
GASを1日1回実行させて、実行した日(=曜日)のラジオ番組リストを取得するようにしてみます。
月曜日にGASを実行したら月曜日のラジオ番組リストを取得、火曜日にGASを実行したら火曜日のラジオ番組リストを取得…といった感じです。
で、取得したラジオ番組リストをメールで通知する処理を実装してみます。
1日1回の定期実行は、GASのトリガーで設定します。
プログラム事前準備(Notion側)
GASでNotionからデータを取得できるようにするためには、事前準備が必要です。
まずはNotion側の手順を書いていきます。
インテグレーション作成
インテグレーションを作成します。
ここで作成したAPIキーをプログラムに記述します。
※「表示」→「コピー」でシークレットキーをコピーできます
コネクト
先ほど作成したインテグレーションと、今回GASからデータ取得するNotionデータベースを紐づけます。
※今回はラジオ管理Notion
※「…」→「接続先」→「ラジオ管理Notion」
データベースIDを控える
NotionデータベースのIDを控えておきます。
ここで控えたデータベースIDをプログラムに記述します。
※「yyyyyyyyyy」はビューID
プログラム事前準備(GAS側)
続いて、GAS側の手順を書いていきます。
GASファイル作成
まずはGASファイルを作成します。
スクリプト プロパティ設定
スクリプト プロパティを設定します。
先ほど控えた「インテグレーションキー」や「データベースID」を登録します。
この作業は必須ではないですが、やっておいた方がセキュリティ面で安全かなと思います。
今回は以下3つを登録しています。
プロパティ | 説明 |
---|---|
NOTION_API_KEY | 先ほど作成したインテグレーション |
DATABASE_ID | 先ほど控えたNotionデータベースID |
MAIL_ADDRESS | 通知先のメールアドレス |
上記の値はプログラムに直接記述する方法もありますが、スクリプト プロパティに登録する方がセキュリティ面で安全かなと思います。
この記事でもプログラムを載せたりしますが、直接記述する方法だと隠す必要が出てきます。
そこで「インテグレーションキー」「データベースID」「メールアドレス」を隠し忘れるとセキュリティ面で危険な状態となります。
そういった隠し忘れを未然に防ぐためにも、スクリプト プロパティに登録しておいた方が安全かなと。
プログラム
準備が整ったところで、プログラムです。
// Notionインテグレーションキー const NOTION_API_KEY = PropertiesService.getScriptProperties().getProperty('NOTION_API_KEY'); // ラジオ管理NotionのデータベースID const DATABASE_ID = PropertiesService.getScriptProperties().getProperty('DATABASE_ID'); // メールアドレス const MAIL_ADDRESS = PropertiesService.getScriptProperties().getProperty('MAIL_ADDRESS'); /** * メイン処理 */ function main() { // Notionからデータを取得する const notionDataArray = getNotionData(); // Gmailを送信する sendGmail(notionDataArray); } /** * Notionからデータを取得する */ function getNotionData() { const url = 'https://api.notion.com/v1/databases/' + DATABASE_ID + '/query'; const result = JSON.parse(UrlFetchApp.fetch(url, composeFetchParam())); const retArray = []; for (const data of result.results) { retArray.push({ time: data.properties['時間'].rich_text[0].plain_text, title: data.properties['番組名'].title[0].plain_text, broadcaster: data.properties['放送局'].select.name, }); } return retArray; } /** * 今日の曜日を取得する */ function getWeekday() { const convertWeekday = ['日','月','火','水','木','金','土']; const today = new Date().getDay(); return convertWeekday[today]; } /** * データ取得に必要なパラメータを組み立てる * ・フィルター * ・ソート */ function composeFetchParam() { const payload = { 'filter': { 'and': [ { 'property': '曜日', 'multi_select': { 'contains': getWeekday() } }, { 'property': '番組終了', 'checkbox': { 'equals': false } } ] }, 'sorts': [ { 'property': '時間', 'direction': 'ascending' }, { 'property': '放送局', 'direction': 'ascending' } ] }; const params = { 'method': 'POST', 'headers': { 'Notion-Version': '2022-06-28', 'Authorization': 'Bearer ' + NOTION_API_KEY, 'Content-Type': 'application/json' }, 'payload': JSON.stringify(payload), }; return params; } /** * Gmailを送信する */ function sendGmail(notionDataArray) { const to = MAIL_ADDRESS; const subject = `ラジオ管理Notion(${getWeekday()}曜日)`; const body = createMailBody(notionDataArray); GmailApp.sendEmail(to, subject, body); } /** * メール本文を作成する */ function createMailBody(notionDataArray) { const retBody = []; retBody.push(`${getWeekday()}曜日のラジオ番組一覧`); retBody.push(''); for (const data of notionDataArray) { retBody.push(`${data.time} | ${data.title} | ${data.broadcaster}`); } return retBody.join("\n"); }
上記のプログラムを、以下にコピペします(赤枠)。
プログラムの具体的な説明は、長くなりそうなので割愛します。
別記事にて書こうかなと思います。
プログラム詳細説明
プログラムを具体的に説明した記事を書きました(5記事)。
こちらも良ければぜひ。
今日の曜日を取得する
miya-moto-memo.hatenablog.com
getNotionData部分
miya-moto-memo.hatenablog.com
sendGmail部分
miya-moto-memo.hatenablog.com
スクリプト プロパティについて
miya-moto-memo.hatenablog.com
GASでNotionを使う準備
miya-moto-memo.hatenablog.com
フローチャート
プログラムを実行する前に、フローチャートも載せておきます(ざっくりですが)。
ちなみに上記のフローチャートはMermaidで書いています。
Mermaidに関しては記事も書いています。
こちらも良ければぜひ。
miya-moto-memo.hatenablog.com
今回のフローチャートのMermaidコードも載せておきます。
%%{init:{'theme':'forest'}}%% flowchart TB A([開始]) --> B[[getNotionData\nNotionからデータを取得する]] B --> C[[sendGmail\nGmailを送信する]] C --> D([終了])
プログラム実行
プログラムを実行してみます。
※初回実行時は権限の許可が必要になります
アカウントを選択します
※実行が完了するまで待ちます
※プログラムを実行したのが木曜日だったため、木曜日のリストを取得しました。
トリガー設定
プログラムの実行が成功したら、トリガー設定もしておきます。
GASプログラムを1日1回、定期実行するように設定します。
※以下の画像だと「毎日午後6時~7時に実行」となります。
参考リンク
以下のサイトを参考にさせて頂きました。ありがとうございます。
インテグレーション、コネクト に関して
notion-lab.jp
Notionからデータ取得 に関して
notion-lab.jp
Gmailからメール送信 に関して
note.com
変更対応
メール本文をHTML形式に変更してみました。
TABLEタグにより、少しリッチな表示になっています。
こちらも良ければぜひ。
miya-moto-memo.hatenablog.com
おわりに
ということで、「GASでNotionからデータ取得してGmailで通知する(1日1回 定期実行)」に関してアレコレ書いてみました。
GASに関しては以前、OCR処理を効率化するプログラムを実装しています。
今回は初めてNotionと連携するプログラムを実装してみました。
Notionと連携する部分は色々とつまづくかなと思っていたのですが、ほとんどつまづくことなくスンナリとNotionからデータ取得できました。
また、Gmailで送信する部分もアッサリと実装できました。
参考サイトが豊富にあったのが大きいかなと思います。
この記事が参考になれば幸いです。
関連記事
GAS(Google Apps Script)に関してはいくつか記事にしています。
気になる記事があればぜひ。
GASの活用事例
GASでNotionからデータ取得してGmailで通知する - 派生記事