はじめに
Google Apps Scriptでサービスアカウントを使えないかと思い、ぐぐったら以下の記事が見つかった。
Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~
サービスアカウントを使えば承認画面不要で、ユーザーに成り代わってGASを実行できるようになります。
これは素晴らしく便利そう……
と思い、参考にしてGoogleカレンダーにイベントを登録するスクリプトを書いてみました。
準備
手順として、
- Google Apps Scriptプロジェクト作成
- サービスアカウントの作成
- 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
いつも参考にさせていただいてます。