定期的に Notion ページを作成する : Notion 解説(19)

はじめに

昨日は ics からタスクを登録するアプリを作りました(→ カレンダーデータのデータベースへの一括登録 (Notion API 編): Notion 解説(18) - hkob’s blog)。 他に自動化したいこととすると、毎日書くことにしている雑務・振り返りのページの作成です。現在は、今日の日付でフィルタされた Linked Database にて、New することで今日の日付を自動設定していました。雑務・振り返りテンプレートの1行目に以下の行が書いてあります。先頭で「delete」を押すことで、タイトルに移動するので、日付を記入し、該当する曜日を残すという手動作業を実施しています。

雑務・振り返りX/X (月火水木金土日)

手動作業はなくしたいですし、この手間が面倒で振り返りをサボることもあります。ページが毎日自動作成されていれば、サボることも減るかなと考えています。Notion の API の設定などはこの記事では省略しているので、前の記事を参照してください。

準備

自分でサーバを用意するのは面倒なので、Google Spreadsheet にお願いしてしまいましょう。Google Spreadsheet に Notion というスプレッドシートを作ります。将来何かに使うかもしれませんが、今回はスプレッドシート自体には何も記述しません。

f:id:hkob:20210515065941p:plain
Notion Spreadsheet

ツールメニューのスクリプトエディタを起動します。

f:id:hkob:20210515070119p:plain
スクプリトエディタ

以下のようなスクリプトを作成しました。postNotion は payload をもらって、それを Notion に送るだけのものです。これは昨日のスクリプトとやっていることは同じです。createPayload はタイトルと日付をもらって、payload を作ります。今後別のものを登録したいときに使えるように役割を分離しました。doEverydayPost は引数なしで上記のタイトルと日付を作ります。タイトルも日付が入るので、同じように today から作成しています。曜日名は日本語にしたかったので、これも別の関数に切り出しています。このくらいしてあると、後で別の作業でも再利用可能になると思います。なお、payload には「タイトル」「日付」以外に「非ポモ?」というチェックボックスも入れています。この辺りは自分の環境に合わせて属性を追加・削除してください。

function postNotion(payload){
  let MY_NOTION_TOKEN = "この部分にIntegration Token を書きます。";
  let url = "https://api.notion.com/v1/pages"; // API URL
  let options = {
    "method" : "POST",
    "headers": {
      "Content-type": "application/json",
      "Authorization": "Bearer " + MY_NOTION_TOKEN,
      "Notion-Version": "2021-05-13",
    },
    "payload" : JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options);
}

function createPayload(title, date_str) {
  let DATABASE_ID = "この部分にDatabase ID を書きます";

  payload = {
    "parent": {
      "database_id": DATABASE_ID
    },
    "properties": {
      "タスク名": {
        "title": [
          {
            "text": {
              "content": title
            }
          }
        ]
      },
      "日付": {
        "type": "date",
        "date": {
          "start": date_str
        }
      },
      "非ポモ?": {
        "type": "checkbox",
        "checkbox": true
      }
    }
  }
  return payload;
}

function weekToStr(date) {
  let w = Utilities.formatDate(date, "JST", "u");
  return ["日", "月", "火", "水", "木", "金", "土"][w]
}

function doEverydayPost() {
  let today = new Date();
  let date_str = Utilities.formatDate(today, "JST", "yyyy-MM-dd");
  let week_str = weekToStr(today);
  let title_base = "雑務・振り返り M/d (" + week_str + ")";
  let title = Utilities.formatDate(today, "JST", title_base);
  // テストのためのデバッグ出力
  //  Logger.log(createPayload(title, date_str));
  postNotion(createPayload(title, date_str));
}

後で、ここにdoPost(e)を追加して、Slack のコマンドで Notion のテーブルに機能を追加できるようにするつもりです。

テスト実行

スクリプトの上の部分で「doEverydayPost」を選択し、「実行」をクリックします。

f:id:hkob:20210515083612p:plain
テスト実行

Notion を開いてみると、無事にタスクが追加されていました。

f:id:hkob:20210515083753p:plain
追加されたタスク

デプロイと繰り返し実行設定

動作が確認できたので、デプロイします。右上の「デプロイ」ボタンをクリックし、「新しいデプロイ」を選択します。

f:id:hkob:20210515084105p:plain
新しいデプロイ

デプロイタイプを聞かれるので、ウェブアプリとします。

f:id:hkob:20210515084310p:plain
ウェブアプリを選択

「Notion ページを作成」というアプリにします。

f:id:hkob:20210515084456p:plain
Notion ページを作成アプリ

新しいウェブアプリが作成されました。URI ができていますが、今回は特に使いません。これは後で Slack のコマンドを作った時に使います。

次に今回の目的である自動作成のためのトリガーを設定します。左側の時計のマークのトリガーをクリックします。

f:id:hkob:20210515084855p:plain
トリガー設定

トリガーはまだ何も設定していないので、空の状態です。右下のトリガーを追加をクリックします。

f:id:hkob:20210515085018p:plain
トリガーを追加

先ほどテストした「doEverydayPost」を「時間手動型」で駆動します。毎日なので、「日付ベースのタイマー」とし、時間は「午前5時〜6時」に設定しました。

f:id:hkob:20210515085504p:plain
時間手動型のトリガー

おわりに

これで明日の朝からは、毎日「雑務・振り返り」ページが自動作成されます。ページを開いたら、雑務・振り返りテンプレートを選択すれば、それ以外の各種項目が設定されます。これで記録をサボることが減るでしょうかね。


はてなブログに書いた Notion 記事一覧