Google Apps Scriptでサービスアカウントを使いGoogleカレンダーにイベントを登録する

はじめに

Google Apps Scriptでサービスアカウントを使えないかと思い、ぐぐったら以下の記事が見つかった。

Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~

サービスアカウントを使えば承認画面不要で、ユーザーに成り代わってGASを実行できるようになります。
これは素晴らしく便利そう……
と思い、参考にしてGoogleカレンダーにイベントを登録するスクリプトを書いてみました。

準備

手順として、

  1. Google Apps Scriptプロジェクト作成
  2. サービスアカウントの作成
  3. Google Apps Scriptプロジェクトの設定

がありますが、他の記事で丁寧に説明されているので
以下のすばらしい記事をご参考ください。

Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~
ほぼこちらの記事のままです。
こちらの手順を進め、最後のコードだけ変更してください。

サービスアカウントを使ってG Suiteドメイン内のカレンダーにアクセスする
サービスアカウントの作成に関してはこちらが参考になります。

ソース

  // 認証情報のJSONを取得
  var jsonKey = JSON.parse(PropertiesService.getScriptProperties().getProperty("jsonKey"));

  // カレンダーのスコープを指定
  var serverToken = new GSApp.init(jsonKey.private_key, ["https://www.googleapis.com/auth/calendar"], jsonKey.client_email);

  // カレンダーID(メールアドレス)
  var calendarId = 'xxx@domain.com';

  // トークンの取得
  var tokens = serverToken.addUser(calendarId).requestToken().getTokens();

  // イベント  
  var payload = {
    "start": {
      "date": "2018-03-07"
    },
    "end": {
      "date": "2018-03-09"
    },
    "summary": "test"
  };

  // リクエストの設定 
  var fetchOptions = {'method':'post','payload':JSON.stringify(payload),'contentType':'application/json','headers':{Authorization:"Bearer "+tokens[calendarId].token}};

  //リクエストURLを作成  
  var url = "https://www.googleapis.com/calendar/v3/calendars/" + calendarId + "/events";

  //fetch
  var res = UrlFetchApp.fetch(url, fetchOptions);

気をつけるのは、

  • payloadをきちんとJSONにすること
  • プロジェクトページでAPIを有効にすること

です。(私が全く気づかずはまったところ)

payloadの内容に関してはGoogleのAPIページ右の「Try this API」で実際に試すと間違いがないです。
https://developers.google.com/calendar/v3/reference/events/insert

参考

Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~

thank's @soundTricker
いつも参考にさせていただいてます。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.