みやもとメモ

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

目次
目次

GASでNotionにタスクを自動登録してLINE通知する(1日1回 定期実行)

この記事をシェアする

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

これまで何度か「GASでNotionからデータ取得する」処理を実装して記事にしています(以下リンク)。

データ取得以外のこともしてみたいなと思い、GASでNotionにデータ登録する処理を実装してみました。

今回はその辺りに関して書いてみます。

それでは本題へ。

前提情報

いくつか前提情報を書いておきます。

GASとは?

Google Apps Script(GAS)は、ひとことで言えばGoogleが提供する各種サービスの自動化/連携を行うためのローコード開発(※1)ツールです。GASを使うと、Gmailやカレンダー、GoogleスプレッドシートGoogleドライブなど、Googleが提供する様々なサービス上で処理を自動化したり、複数のサービスを連携させたりできます。
※1:ローコード開発:可能な限りソースコードを書かずにアプリケーションを開発する手法

出典:【入門】GASとは?できること&活用法を解説(サンプルコード付き) - マーケティングオートメーションツール SATORI

詳しくは以下のサイトを見て頂ければと。
satori.marketingwww.cocoe.co.jp

Notionとは?

Notionとはアメリカ・サンフランシスコを拠点とするスタートアップ企業Notion Labsが開発した多機能ドキュメントツールです。プロジェクト管理やスケジュール管理、社内wikiなど目的に応じて使い分けられるさまざまなドキュメントを集約できるため「オール・イン・ワンツール」と呼ばれています。

出典:【万能アプリ】Notionとは?何がスゴイ?使い方や活用事例、料金などについてわかりやすく解説 - 2023/12/08 [Schoo]

詳しくは以下のサイトを見て頂ければと。
schoo.jpwww.sbbit.jp

LINE Notifyとは?

LINE Notify(ラインノーティファイ)とは、LINEとWebサービスを連携し、ユーザーが通知を受け取れるサービスです。LINEアカウントを持っているユーザーであれば誰でも使え、グループでの通知設定もできます。

出典:LINE Notifyとは?特徴や効果的な使い方、注意点を解説 | Lステップ公式ブログ

メッセージを送る方法としてLINE Messaging APIがあるみたいですが今回はGASを通してメッセージを送りたかったのでLINE Notifyを利用します。

出典:GASを使用してLINEにメッセージを送る | 株式会社ウイングドア

詳しくは以下のサイトを見て頂ければと。
linestep.jpwingdoor.co.jp

やりたいこと

普段の運用

自分はNotionで日記を書いています。

日記を書くページは毎日23時55分に自動作成されます。
そして自動作成されたタイミングで通知が来ます。

自動作成と通知はNotionの機能により実現しています。
①自動作成:データベーステンプレートの繰り返し設定
②通知:自分にメンション


やりたいこと

上記の機能で十分運用できているのですが、最近GASで色々試しているところでして。
Notionにデータ登録する処理を実装してみたいという気持ちがあったのでやってみようかなと。

上記①はGASで登録処理を実装し、トリガー機能で1日1回定期実行するように設定します。
上記②はLINE Notifyで通知します。


関連リンク

日記Notionの詳細は以下リンクを見て頂ければと。
miya-moto-memo.hatenablog.com

シーケンス図

全体像をシーケンス図にまとめてみました。

シーケンス図

ちなみに上記のシーケンス図はMermaidで書いています。
Mermaidに関しては記事も書いています。
こちらも良ければぜひ。

miya-moto-memo.hatenablog.com

今回のシーケンス図のMermaidコードも載せておきます。

%%{init:{'theme':'default'}}%%
sequenceDiagram
	autonumber
	Note over GAS: 1日1回 定期実行
	GAS->>Notion: データ登録
	Notion->>GAS: 登録したデータのURL返却
	GAS->>LINE: メッセージ通知(URL付き)
	actor User
	User->>LINE: メッセージ確認
	User->>Notion: URLをクリックして日記書く

事前準備

「GASでNotionを操作する準備」「GASでLINE通知する準備」それぞれ必要になります。

GASとNotionの連携

GASでNotionからデータを取得するためには、事前準備が必要です。
事前準備の手順は別記事にて詳しく書いています。
以下あたりの記事を見てもらえればと思います。
miya-moto-memo.hatenablog.commiya-moto-memo.hatenablog.com

LINE Notifyでトークン発行

GASでLINE Notifyを使用するのにも事前準備が必要です。
事前準備の手順は別記事にて詳しく書いています。
以下の記事を見てもらえればと思います。
miya-moto-memo.hatenablog.com

プログラム

準備が整ったところで、プログラムです。
※事前準備が完了している前提です。

// Notionインテグレーションキー
const NOTION_API_KEY = PropertiesService.getScriptProperties().getProperty('NOTION_API_KEY');
// 日記NotionのデータベースID
const DATABASE_ID = PropertiesService.getScriptProperties().getProperty('DATABASE_ID');
// LINE Notify トークン
const LINE_NOTIFY_TOKEN = PropertiesService.getScriptProperties().getProperty('LINE_NOTIFY_TOKEN');

/**
 * メイン処理
 */
function main() {
  // Notionにデータ登録
  const createdNotionData = createNotionData();
  // LINE通知
  notifyLine(createdNotionData);
}

/**
 * Notionにデータ登録
 */
function createNotionData() {
  const url = 'https://api.notion.com/v1/pages';
  return JSON.parse(UrlFetchApp.fetch(url, composeFetchParam()));
}

/**
 * データ登録に必要なパラメータを組み立てる
 */
function composeFetchParam() {
  const payload = {
    'parent': {'database_id': DATABASE_ID},
    'properties': {
      'タイトル': {
        'title': [{
          'text': {
            'content': getCurrentDate().replaceAll('-', '/')
          }
        }]
      },
      '日付': {
        'date': {
          'start': getCurrentDate()
        }
      },
      'ステータス': {
        'status': {
          'name': '未着手'
        }
      },
    }
  };

  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;
}

/**
 * 日付をフォーマットする
 * ※dateプロパティにスラッシュ区切りを渡すとエラーになる
 */
function getCurrentDate() {
  const now = new Date();
  const year = now.getFullYear();
  const month = zeroPadding(now.getMonth()+1);
  const date = zeroPadding(now.getDate());
  return year + '-' + month + '-' + date;
}

/**
 * ゼロ埋めする
 */
function zeroPadding(str) {
  return ('0' + str).slice(-2);
}

/**
 * LINE通知する
 */
function notifyLine(createdNotionData) {
  const url = 'https://notify-api.line.me/api/notify';
  const params = {
    'method': 'post',
    'headers': {'Authorization': 'Bearer ' + LINE_NOTIFY_TOKEN},
    'payload': {'message': createLineMessage(createdNotionData)},
  };
  // メッセージ通知
  UrlFetchApp.fetch(url, params);
}

/**
 * LINEのメッセージ内容を作成
 */
function createLineMessage(createdNotionData) {
  let msg = [];
  msg.push('今日の日記を書いてください');
  msg.push(createdNotionData.url);
  return msg.join('\n');
}

スクリプトプロパティとして以下3つを登録しています。

プロパティ 説明
NOTION_API_KEY Notionインテグレーション
DATABASE_ID NotionデータベースID
LINE_NOTIFY_TOKEN LINE Notify トーク

プログラムの具体的な説明は、長くなりそうなので割愛します。
別記事にて書こうかなと思います。

プログラム詳細

プログラムを具体的に説明した記事を書きました。
こちらも良ければぜひ。

Notionデータベースにタスクを登録する(Create a page)
miya-moto-memo.hatenablog.com

プログラム実行

上記のプログラムを実行すると、日記Notionにタスクが追加されます。
※プログラムは「2024年6月5日」に実行しています。

プログラム実行
GASの実行でタスクが登録される

そしてLINEから通知が来ます。

LINE通知が来る

「URL」をクリックすると対象の日記ページが開きます。
※以下の画像(右)はNotionアプリのページです。

「URL」をクリックすると日記ページが開く

トリガー設定

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


STEP
「トリガー」をクリック
STEP
「トリガーを追加」をクリック
STEP
トリガーを設定して、「保存」をクリック
※以下の画像だと「毎日午後11時~午前0時に実行」となります

これで「毎日午後11時」あたりに日記Notionにデータ登録し、LINE通知されます。
GASのトリガー設定だと「午後11時~午前0時」といった感じで1時間の幅があるのが気になりますが、まぁ良いかなと。

追加対応:ブロックも作成する

自動登録したタスクの中身(ブロック部分)を作成する追加対応をしてみました。
こちらも良ければぜひ。
miya-moto-memo.hatenablog.com

おわりに

ということで、「GASでNotionにタスクを自動登録してLINE通知する(1日1回 定期実行)」に関してアレコレ書いてみました。

Notionデータ登録時の各プロパティの設定は若干独特ですが、そこは慣れるしかないかなと。
今回はプロパティ3つだけなので、そこまで苦労はなかったです。
プロパティが多くなると苦労しそうです(そしてコード量が多くなりそうです)。

この記事が参考になれば幸いです。

関連記事

GAS(Google Apps Script)に関してはいくつか記事にしています。
気になる記事があればぜひ。

GASの活用事例


GASでNotionにタスクを自動登録してLINE通知する - 派生記事

TOPへ戻る HOMEへ