みやもとメモ

「Notion」「Google Apps Script」「ブログカスタマイズ」などについて書いていきます。

目次
目次

GASでNotionからデータ取得してGmailで通知する(1日1回 定期実行)

この記事をシェアする

今回はGAS(Google Apps Script)に関して書いていきます。

普段からNotionをよく使っていて、GASでNotionからデータを取得するプログラムを書いてみたいなと思っていました。

今回はお試しの気持ちも含めて、以下の処理をGASで書いてみます。

ざっくりまとめると「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回実行させて、実行した日(=曜日)のラジオ番組リストを取得するようにしてみます。
月曜日にGASを実行したら月曜日のラジオ番組リストを取得、火曜日にGASを実行したら火曜日のラジオ番組リストを取得…といった感じです。

で、取得したラジオ番組リストをメールで通知する処理を実装してみます。

1日1回の定期実行は、GASのトリガーで設定します。

プログラム事前準備(Notion側)

GASでNotionからデータを取得できるようにするためには、事前準備が必要です。
まずはNotion側の手順を書いていきます。

インテグレーション作成

インテグレーションを作成します。
ここで作成したAPIキーをプログラムに記述します。


STEP
インテグレーション管理ページを表示し、「新しいインテグレーション」をクリック
STEP
名前を入力し、「送信」をクリック
STEP
これでインテグレーションの作成が完了です
※「表示」→「コピー」でシークレットキーをコピーできます

コネクト

先ほど作成したインテグレーションと、今回GASからデータ取得するNotionデータベースを紐づけます。


STEP
対象のNotionデータベースを開く
※今回はラジオ管理Notion
STEP
対象のNotionデータベースのページで、先ほど作成したインテグレーションをコネクト
※「…」→「接続先」→「ラジオ管理Notion」
STEP
「はい」をクリック
STEP
以下の状態になっていればOK

データベースIDを控える

NotionデータベースのIDを控えておきます。
ここで控えたデータベースIDをプログラムに記述します。

データベースIDを控えておく

サンプルURL

上記の「xxxxxxxxxx」がデータベースIDです。
※「yyyyyyyyyy」はビューID

プログラム事前準備(GAS側)

続いて、GAS側の手順を書いていきます。

GASファイル作成

まずはGASファイルを作成します。


STEP
GoogleドライブでGASファイルを新規作成
※どこのフォルダに配置するかはお好みで
STEP
GASの編集画面が表示される
左上にあるファイル名を変更します
STEP
ファイル名を変更する

スクリプト プロパティ設定

スクリプト プロパティを設定します。
先ほど控えた「インテグレーションキー」や「データベースID」を登録します。

この作業は必須ではないですが、やっておいた方がセキュリティ面で安全かなと思います。


STEP
「プロジェクトの設定」をクリック(歯車マーク)
STEP
ページの下の方にある「スクリプト プロパティを追加」をクリック
STEP
プロパティを設定し、「スクリプト プロパティを保存」をクリック

今回は以下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([終了])

プログラム実行

プログラムを実行してみます。


STEP
GASファイル上で「実行」をクリック
STEP
「権限を確認」をクリック
※初回実行時は権限の許可が必要になります
STEP
以下の子画面が表示されます
アカウントを選択します
STEP
詳細を表示して、「ラジオ管理Notionから通知(安全ではないページ)に移動」をクリック
STEP
「許可」をクリック
STEP
実行が開始します
※実行が完了するまで待ちます
STEP
メールが届きます(Gmail
STEP
メール本文に対象曜日のラジオ番組リストが載っています

※プログラムを実行したのが木曜日だったため、木曜日のリストを取得しました。

木曜日のラジオ番組リストを取得

トリガー設定

プログラムの実行が成功したら、トリガー設定もしておきます。
GASプログラムを1日1回、定期実行するように設定します。


STEP
「トリガー」をクリック
STEP
「トリガーを追加」をクリック
STEP
トリガーを設定して、「保存」をクリック
※以下の画像だと「毎日午後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で通知する - 派生記事

TOPへ戻る HOMEへ