LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

Sunday, December 24, 2017

Googleカレンダーでイベントのlinkを取得する(EVENT_ID)


Google Apps ScriptのCalendar ServiceではカレンダーのイベントIDを取得できないようなのでCalendar APIを利用して取得しました


ここでいうイベントIDはこれです


htmlLinkからイベントIDを抜き出す方法を書きます

要点だけ先にいうと、Calendar APIを有効にしてから以下のコードでhtmlLinkからイベントIDを取得できます

コード.gs
function get_event_id() {
  var events = Calendar.Events.list("primary", {
    timeMin: new Date().toISOString(),
    singleEvents: true,
    orderBy: "startTime",
    maxResults: 1
  });
  var link = events.items[0].htmlLink;
  var event_id = link.split("eid=")[1];
  Logger.log([link, event_id]);
}



Google Apps ScriptのCalendar Serviceでは以下のようなコードでイベントIDを取得できそうな気がしましたがこのコードで取得するIDとは違っていたので、今回Calender APIを使ってみました


コード.gs
function get_event_id(){
  var calendar = CalendarApp.getCalendarById("primary");
  var events = calendar.getEventsForDay(new Date());
  var events0_id = events[0].getId();
  Logger.log(events0_id);
}

hoge@google.comがログに出てきますが、欲しいのはこれじゃない!



Googleカレンダーでイベントのlinkを取得する(htmlLink)では、以下の画面を開くリンクを取得できました



今回は↑の編集アイコンをクリックした先の以下の画面を開くリンクを作ってみます

今回はシートに書き出す処理も追加します

  1. Google Calendar API を有効にする
  2. htmlLinkからEVENT_IDを取得して編集画面へのリンクを作る
  3. 実行する
  4. シートに書き出す



1. Google Calendar API を有効にする


有効にする方法がわからない場合は こちらへ


2. htmlLinkからEVENT_IDを取得して編集画面へのリンクを作る


Googleカレンダーでイベントのlinkを取得する(htmlLink) を以下のように改造します

コード.gs
function listNext10Events_with_event_link() {
  var calendarId = 'primary';
  var now = new Date();
  var events = Calendar.Events.list(calendarId, {
    timeMin: now.toISOString(),
    singleEvents: true,
    orderBy: 'startTime',
    maxResults: 10
  });
  var array = [];
  if (events.items && events.items.length > 0) {
    for (var i = 0; i < events.items.length; i++) {
      var event = events.items[i];
      var link = event.htmlLink;
      if (event.start.date) {
        var start = event.start.date;
        array.push([event.summary, start, link]);
      } else {
        var start = Utilities.formatDate(new Date(event.start.dateTime), 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm');
        array.push([event.summary, start, link]);
      }
    }
  } else {
    array.push('No events found.');
  }
  set_values(array);
}

function set_values(array){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sh.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}


3. 実行する

listNext10Events_with_event_link()を実行します

4. シートに書き出す


これからの予定10件を取得して
A列にタイトル、B列に開始時間、C列に編集画面へのリンクが入力されます



おまけ


終了時間や場所も取得して書き出す場合は
event.end や event.location でそれぞれ取得できます

取得できる項目一覧はこちら
Events/Resource representations

以下のコードは開始日時と終了日時を指定して100件の予定をシートに書き出すコードの例です


コード.gs
function get_data() {
  var calendarId = "primary";
  var start = new Date("2017/12/24");
  var end = new Date("2017/12/25");
  var events_data = Calendar.Events.list(calendarId, {
    timeMin: start.toISOString(),
    timeMax: end.toISOString(),
    singleEvents: true,
    orderBy: "startTime",
    maxResults: 100
  });
  var events = get_events(events_data);
  Logger.log(events);
  set_values(events);
}

function get_events(events){
  var array = [];
  if (events.items && events.items.length > 0) {
    for (var i = 0; i < events.items.length; i++) {
      var event = events.items[i];
      var start_date = get_date(event.start);
      var end_date = get_date(event.end);
      var summary = event.summary;
      var location = event.location;
      if(location == null){
       location = ""; 
      }
      var link = event.htmlLink;
      var key = link.split("eid=")[1];
      var url = "https://calendar.google.com/calendar/r/eventedit/" + key;
      var duration = (new Date(end_date) - new Date(start_date));
      var hour = Math.floor(duration / (1000 * 60) / 60);
      var min = duration / (1000 * 60) % 60;
      var time = (hour + ":" + min);
      array.push([start_date, end_date, time, summary, location, url]);
    }
  } else {
    array.push("No events found.");
  }
  return array;
}

function get_date(date) {
  if (date.dateTime != null) {
    date = format_date(date.dateTime);
  } else {
    date = date.date;
  }
  return date;
}

function format_date(date){
 return Utilities.formatDate(new Date(date), 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm');
}

function set_values(array){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sh.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}


関連記事

Googleカレンダーでイベントのlinkを取得する(htmlLink)


参考

Google Calendar API (calendar/quickstart/apps-script)
https://developers.google.com/google-apps/calendar/quickstart/apps-script

Calendar Service
https://developers.google.com/apps-script/reference/calendar/


maxResults
Maximum number of entries returned on one result page. By default the value is 100 entries. The page size can never be larger than 250 entries. Optional.
https://developers.google.com/google-apps/calendar/v3/reference/calendarList/list

Google Calendar API Usage Limits
The Google Calendar API has a courtesy limit of 1,000,000 queries per day.
https://developers.google.com/google-apps/calendar/pricing?hl=ja


Listing events
https://developers.google.com/apps-script/advanced/calendar

Events/Resource representations
https://developers.google.com/google-apps/calendar/v3/reference/events#resource

Latest post

Extracting data from Google Sheets with regular expressions

Introduction Regular expressions are a powerful tool that can be used to extract data from text.  In Google Sheets, regular expressions ca...