13
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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@example.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
いつも参考にさせていただいてます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
13
Help us understand the problem. What are the problem?