カレンダーアプリは 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++;
}
}
認証,認証,また認証
コードの上にある実行ボタンを押すと,「まず保存しろ」と出るので保存する.
適当な名前をつけて保存する.
承認を求められる
再生ボタンをもう一度押す.今度は承認を求められる.メインに使うアカウントを選択しないと Google Apps Script は動かない.注意が必要だ.
「詳細」を押せ,「安全なページに戻る」は押すな
「(安全ではないページ)に移動」を押せ
ダイアログの一番下に目立たないように「(安全ではないページ)に移動」というリンクがある.これを押す.
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 形式でダウンロードするなりして後は好きに加工したら良い.