📆

GASでNotionのスケジュールをGoogleカレンダーにコピーする

2022/11/27に公開

概要

Notionの作成したスケジュールをGoogleカレンダーにコピーしたい。お金かけたくないのでNotion APIとGASで実装してみた。

実装

Notion API

カレンダービューを持つデータベースを作成して、Notion API用のintegrationを追加する。

以前は"Share"からintegrationを追加していたようだが、2022年10月現在では "Connections" からintegrationを追加するように仕様変更されているので注意。

Notion APIのリファレンスを参考にしながら以下の機能を実装。

notion.gs
const NOTION_API_TOKEY = "secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
const DATABASE_ID = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
const NOTION_VERSION = "2022-06-28"

// Notion内のタスクを取得する関数
function getNotionTasks() {

  const req_header = {
    "Content-Type": "application/json; charset=UTF-8",
    "Authorization": "Bearer " + NOTION_API_TOKEY,
    "Notion-Version": NOTION_VERSION
  }

  const req_options = {
    "method": "post",
    "headers": req_header
  }

  const url = `https://api.notion.com/v1/databases/${DATABASE_ID}/query`
  const res = UrlFetchApp.fetch(url, req_options).getContentText('UTF-8')

  const notion_results = JSON.parse(res)["results"]
  
  // タスク名、開始日、終了日を抽出して返す
   return notion_results.map(
    page => ({
    "title": page["properties"]["Name"]["title"][0]["plain_text"],
    "start": page["properties"]["Date"]["date"]["start"],
    "end": page["properties"]["Date"]["date"]["end"]
    })
  )
}

Googleカレンダー

コピー先のGoogleカレンダーのカレンダーIDを取得してコードに貼り付ける。

gcalender.gs
// GoogleカレンダーのカレンダーIDを取得してコードに記入しておく。
const CALENDER_ID = "****************************************************************@group.calendar.google.com"

function registerGCalenderTask(task_name, start, end) {
  const my_calender = CalendarApp.getCalendarById(CALENDER_ID)
  my_calender.createAllDayEvent(task_name, start, end)
}

Main部分

main.gs
function main() {
  notion_tasks = getNotionTasks()

  // register task notion to gcalender
  notion_tasks.forEach( i => {
    if (i["end"]) {
      registerGCalenderTask(i["title"], new Date(i["start"]), new Date(i["end"]))
    } else {
      registerGCalenderTask(i["title"], new Date(i["start"]))
    }
  })
}

実行

1. Notionのカレンダーにサンプルタスクを設定する

Notionのサンプルタスク

2. main.gsを実行する

3. 結果としてGoogleカレンダーにタスクがコピーされる

Googleカレンダーにタスクがコピーされた

改善点

NotionとGoogleカレンダー間で同期されているわけではないので、継続的に利用する場合は要改善。その場合はGASのタイマートリガーで定期実行を行うとよさそう。また、main.gsを複数回実行すると、その度にGoogleカレンダー上のタスクが重複してコピーされる問題がある。

Discussion