Google Apps Scriptでカレンダーからイベントを抽出する

 カレンダーアプリは Google カレンダーに依存している.Google カレンダーから日付とイベント,詳細を抽出する必要が出てきたため,小一時間調べた方法を備忘録として残しておく.

直接データに触るならGoogle Apps Scriptは避けて通れない

Google Apps Scriptとは?

 そもそも Google Apps Script とは何か.JavaScript に似たプログラミング言語である.ユーザーの端末上で実行されるのではなく,サーバー側で実行される.しかし,ユーザーにはあまり違いは分からない.

より効率よくデータを扱うために

 そもそも Gmail, Document, Spreadsheet, Form, Calendar, Map など,言語を知らなくても使えるアプリは山ほどあるし,多くの人は言語など気にせずにアプリを使っている.

 しかし,Google Apps Script を使うことで,より効率よくデータを扱えるようになる.そのための「お作法」を覚える必要はあるのだが.

参考書籍

 掌田津耶乃の著作.少し古いが,初心者はここから入るとよいだろう.この記事で紹介するコードはこの本からのコピペである.

スプレッド シートのスクリプトエディタから入る

まずは,スプレッドシートの作成から

 データを抽出する先がスプレッドシートなので,マイドライブの「新規」をクリックしてスプレッドシートを作成する.

スプレッドシートの新規作成
スプレッドシートの新規作成

スプレッドシートはサーバーエラーが起きやすい

 最近の傾向なのか不明だが,スプレッドシートではよくサーバーエラーが発生する.頻繁に発生するため,スプレッドシート上で巨大なデータをあまり扱いたくない.

スプレッドシートのサーバーエラー
スプレッドシートのサーバーエラー

 関係あるか不明だが,「処理中…」が長く出た後には高率にエラーが発生している気がする.

「処理中...」の後には高率にエラーが発生する
「処理中…」の後には高率にエラーが発生する

「ツール」メニューから「スクリプトエディタ」

 「ツール」メニューから「スクリプトエディタ」を選ぶ.

「ツール」メニューから「スクリプトエディタ」を選ぶ
「ツール」メニューから「スクリプトエディタ」を選ぶ

 「無題のプロジェクト」ウィンドウが開く.ここにコードを記述していく.

「無題のプロジェクト」がウィンドウが開く
「無題のプロジェクト」がウィンドウが開く

まずは,カレンダーIDを取得しよう

 実際のコードは下記のようになる.

function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var cals = CalendarApp.getAllCalendars();
var index = 1;
for (var i in cals){
var cal = cals[i];
sheet.getRange(index,1).setValue(cal.getName());
sheet.getRange(index,2).setValue(cal.getId());
sheet.getRange(index,3).setValue(cal.getDescription());
sheet.getRange(index,4).setValue(cal.getColor());
sheet.getRange(index,5).setValue(cal.isSelected());
index++;
}
}

カレンダーIDを取得するコード
カレンダーIDを取得するコード

認証,認証,また認証

 コードの上にある実行ボタンを押すと,「まず保存しろ」と出るので保存する.

「プロジェクトを実行するには,先に保存する必要があります.保存しますか?」「はい」を押す
「プロジェクトを実行するには,先に保存する必要があります.今すぐ保存しますか?」「はい」を押す

 適当な名前をつけて保存する.

「新しいプロジェクト名を入力してください」と聞いてくるので適当な名前をつける
「新しいプロジェクト名を入力してください」と聞いてくるので適当な名前をつける

承認を求められる

 再生ボタンをもう一度押す.今度は承認を求められる.メインに使うアカウントを選択しないと Google Apps Script は動かない.注意が必要だ.

「アカウントの選択」ではメインに使うアカウントを選択する
「アカウントの選択」ではメインに使うアカウントを選択する

「詳細」を押せ,「安全なページに戻る」は押すな

警告画面が出るが気にせず「詳細」をクリック
警告画面が出るが気にせず「詳細」をクリック

「(安全ではないページ)に移動」を押せ

 ダイアログの一番下に目立たないように「(安全ではないページ)に移動」というリンクがある.これを押す.

「このアプリは確認されていません」では「(安全ではないページ)に移動」を押せ
「このアプリは確認されていません」では「(安全ではないページ)に移動」を押せ

Googleアカウントへのリクエストを許可する

 アカウントへのリクエストを許可する.これでようやく先程のコードを実行する許可が降りた.

「Googleアカウントへのアクセスをリクエストしています」を「許可」する
「Googleアカウントへのアクセスをリクエストしています」を「許可」する

 スプレッドシートに使用しているカレンダーの ID, 名前,色などが抽出されたはずだ.

頻発するエラー

 手打ちでコードを記述しているとエラーが頻発して困る.Google Apps Script はかなり作法に厳しい.

大文字,小文字を区別する

 大文字,小文字を厳密に区別する.最初知らずにコードを書いていたが,エラーが頻発した.

デバッグを使おう

 よく見ると虫の形をしたボタンがある.これはデバッグと言って,実際にコードを実行する前にエラーを見つけてくれるものだ.

 試しに変数の文字を変えてみる.SpreadsheetApp という名前が正しいのだが,SpreasheetApp に変えると,もう動かない.一文字なくしただけでプログラムは動かなくなる.デバッグの一例.変数名がおかしい

デバッグの一例.変数名がおかしい

 もう一例出してみよう.今度は変数の大文字を小文字に変えただけである.これもすぐに動かなくなる.

変数の大文字を小文字に変えてみる.これもエラーが発生して動かなくなる
変数の大文字を小文字に変えてみる.これもエラーが発生して動かなくなる

 人の話す言語は多少文法がおかしくても理解できるのだが,プログラム言語は文法の間違いに対しては非常にシビアだ.ここらへんがとっつきにくさの原因なのかも知れない.

Calendar ID はシングルクオーテーションで囲え

 これも知らなかったのだが,関数の括弧内にカレンダー ID を引数に記述する際にはシングルクオーテーションで囲ってやらないと認識しない.Java Script 使いには常識以前の前提なのだろうが,これも知らないうちは分からない.

カレンダー内のイベントを抽出しよう

 Calendar ID は通常,Gmail アドレスと同じになっているはずだ.このカレンダー ID はGoogle Apps Script でカレンダーを扱う際に必須の情報である.

function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var cal = CalendarApp.getCalendarById('********@gmail.com');
var d1 = new Date();
d1.setDate(1);
d1.setHours(0);
d1.setMinutes(0);
d1.setSeconds(0);
var d2 = new Date();
d2.setDate(1);
d2.setMonth(d2.getMonth()+12);
d2.setHours(0);
d2.setMinutes(0);
d2.setSeconds(0);
Logger.log(d1);
Logger.log(d2);
var evts = cal.getEvents(d1,d2);
var index = 1;
if (evts.length > 0){
for (var i in evts){
var evt = evts[i];
sheet.getRange(index,1).setValue(evt.getTitle());
sheet.getRange(index,2).setValue(evt.getDescription());
sheet.getRange(index,3).setValue(evt.getStartTime());
sheet.getRange(index,4).setValue(evt.getEndTime());
index++;
}
}}

 これが実際のコードである.見慣れないうちは何が書いてあるかさっぱり分からないだろうが,心配はいらない.俺も分からない.

 3 行目の********@gmail.com という文字列が Calendar ID である.実際の環境では自分の Gmail アドレスに置き換えて実行してみてほしい.

動く…動くぞ…!

 スプレッドシートに戻ってみると,今後 1 年分のカレンダーの内容が抽出されていることと思う.EXCEL 形式でダウンロードするなりして後は好きに加工したら良い.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください