[Notion]ページのカバー画像をタイマーで時間帯に沿った背景に切り替えてみた

ページのカバー画像をAPI経由で変えられることを確認したので、時間帯に合わせて背景を切り替えてみました。
2022.11.28

Notionのカバー画像を色々変えていると、時間帯に合わせて自動変化させてみたいなとふと思いました。必要になる要素はカバー画像の更新を時間トリガーで行う辺りです。トリガー設定のデバッグがやりやすい点でGASを使ってみました。

カバー画像の差し替えをAPIで行う

使うのは以下のAPIです。

問題となるのはカバー画像更新時の制約です。

We don't currently support uploading files to Notion through the API, however, for files already uploaded to Notion, we support retrieving the file URL.

ファイルをAPI経由で直接アップできないので、別のスペースにアップしたファイルを参照する必要があります。レンタルサーバスペース等の公開スペースを用意してアップしましょう。今回はPixabayから富士山の画像をダウンロードしてやってみました。

var cover_pattern = {
  '6': 'https://path/to/mount-fuji-2297961_1920.jpg',
  '17': 'https://path/to/mount-fuji-2297961_1920.jpg',
  '19': 'https://path/to/mount-fuji-857900_1920.jpg',
  '10': 'https://path/to/snow-3252673_1920.jpg',
}

function updateCover(e) {
  console.log(e)
  var hour = new Date().getHours()
  var url = cover_pattern[hour]
  if (!url) {
    return
  }
  console.log(url)
  var result = sendRequest('https://api.notion.com/v1/pages/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'PATCH', 
  {'cover': 
    {
    'type':'external',
    'external': {'url':url
    }}
  })
 console.log(result)
}

const token = 'secret_XXXXXXXXXXXXXXXXXXXXXXXXX'

function sendRequest(url, method, data=null) {
  let headers = {
    'content-type' : 'application/json',
    'Authorization': 'Bearer ' + token,
    'Notion-Version': '2022-06-28',
    'accept': 'application/json'
  };
  var options ={
    'method': method,
    'headers': headers,
    "muteHttpExceptions" : true,
  }
  if (data) {
    options['payload'] = JSON.stringify(data)
  }

  let notion_data = UrlFetchApp.fetch(url, options);

  notion_data = JSON.parse(notion_data);
  return notion_data;
}

Dateで判定を入れているのは、appscript.jsonのタイムゾーンをJSTに変更しても反映されなかったためです。時間帯で判定したほうがすっきりしますが、手間を省いて朝方・昼間・夕暮れ・真夜中のざっくりとした時間でのみ切り替えることにしました。

GASのトリガーは以下の構成です。1時間毎のトリガーとしていますが、8時間前後くらいのいい塩梅な画像があればトリガー発火頻度も抑えられると思います。

あとがき

APIからリクエストした内容で都度書き換える仕組みなため、リクエストが飛ばなければ切り替わりません。なお、アイコンにも使えます。

Notion側で定期的に切り替わるような仕組みが揃えばお役御免になりますが、現時点で時間帯で切り替わるようなことをしてみたい場合には参考になると幸いです。