シンプルなGASでGoogleCalendarからNotionに予定同期

date
Apr 10, 2022
type
Post
status
Published
slug
gas-google-calendar-to-notion-simple
summary
扱いやすいシンプルなコードで一方向に同期
tags
Automation
Tech
備考
 
本当にシンプルにGoogleカレンダーからNotionに予定を同期するのみのGoogleAppScript。
普段愛用している同期ツールが一時的に使えなくなったのでこれでなんとか耐えます。
シンプルなつくりなので困ったときは軽くいじってサラッと流せそうで安心。
 
const database_id = "xxxxxxxxxxxxxx";
const token = "secret_xxxxxxxxxxxxxxxxxxxxx";


function myFunction() {
  var nDaysFromNow = [0,1,2,3,4,5,6,7]
  for (n of nDaysFromNow) {
    var results = getCalendar(n)
    if (results != null) {
      for (r of results) {
        createIdea(r.title, r.start, r.end);
      }
    }
  }
}

function getCalendar(nDaysFromNow) {
  const calendar = CalendarApp.getCalendarById('xxxxxxxx@gmail.com');
  const today = new Date();
  const d = new Date(new Date().setDate(today.getDate() + nDaysFromNow));
  const events = calendar.getEventsForDay(d);
  if (events.length === 0) {
    console.log("No events found.");
    return null;
  } else {
    var results = [];
    for (event in events) {
      results.push({
        "title": events[event].getTitle(),
        "start": events[event].getStartTime().toISOString(),
        "end": events[event].getEndTime().toISOString()
      })
    }
    return results
  }
}


function createIdea(title, start, end) {
  const url = 'https://api.notion.com/v1/pages';
  let headers = {
    'content-type' : 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + token,
    'Notion-Version': '2021-08-16',
  };
  let payload = {
      'parent': { 'database_id': database_id },
      'icon': {
        'type': "emoji",
        'emoji': "🗓"
    	},
      'properties': {
        'title': { 
          'title':[
            {
              "text": {
                "content": title
              }
            }
          ]
        },
        'by_GAS_gcalSync': {
          'checkbox': true
        },
        'Date': {
          'date': {
            'start': start,
            'end': end,
          }
        },
      },
    };
  let options ={
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload),
  }

  let notion_data = UrlFetchApp.fetch(url, options);
  notion_data = JSON.parse(notion_data);
  return notion_data;
}

© Takuya Okamoto 2021 - 2024 RSS