
photo credit: Free 2010 Work Week Calendar on Me! via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
引き続きGoogleカレンダーの記録を活用して過去の仕事の生産性を測定する方法を進めていきます。
前回はこちらの記事でした。
Googleカレンダーの特定の月のイベントをGoogle Apps Scriptに取り込むことができました。
今回は、出力先をスプレッドシートにに切り替えて集計を進めていきます。
前回のおさらい
前回のスクリプトはこちらでした。
/* 指定月のカレンダーからイベントを取得する */ function getCalendar() { var myCal=CalendarApp.getCalendarById('カレンダーID'); //特定のIDのカレンダーを取得 var date='2016/02/01 00:00:00'; //対象月を指定 var startDate=new Date(date); //取得開始日 var endDate=new Date(date); endDate.setMonth(endDate.getMonth()+1); //取得終了日 var myEvents=myCal.getEvents(startDate,endDate); //カレンダーのイベントを取得 /* イベントの数だけ繰り返してログ出力 */ var maxRow=1; for each(var evt in myEvents){ Logger.log( maxRow+"|"+ //イベントNo evt.getTitle()+"|"+ //イベントのタイトル evt.getStartTime()+"|"+ //イベントの開始日時 evt.getEndTime() //イベントの終了日時 ); maxRow++; } }
スクリプトの流れとしては
- カレンダーIDを指定してカレンダーを取得
- 取得する期間の開始日と終了日を算出
- カレンダーのイベントを取得
- 取得したイベント情報をログ出力
という流れでした。
今回のお題:出力先をスプレッドシートに変更
今回は出力先をスプレッドシートにしたいと思います。
ですから、新規のスプレッドシート「Summary of Working」を作成して、そのメニューから「ツール」→「スクリプトエディタ」を呼び出して、そこにスクリプトを書いていきます。
その上で上記プログラムについて
- 冒頭でスプレッドシートの準備を行う
- 17~22行目のログ出力の代わりにスプレッドシートのセルを指定
- イベントごとの所要時間の計算を実行し出力する
という修正を加えていきます。
目指す流れとしては
- スプレッドシートのシートと最終行を取得
- カレンダーIDによりカレンダーを取得
- 取得する期間の開始日と終了日を算出
- カレンダーのイベントを取得
- 各イベントごとにスプレッドシートに書き出す
- イベントのタイトル、開始時刻、終了時刻を書き出す
- 所要時刻の計算式を書き出す
となります。
では、以降で解説をしていきますね。
カレンダーの特定の月のイベントをスプレッドシートに出力する
スプレッドシートを取得
まずスプレッドシートの準備ですが、スクリプトを記述しているスプレッドシートのアクティブなシートを取得します。
var mySheet=SpreadsheetApp.getActiveSheet(); //シートを取得 var maxRow=2; //書き込みの開始行
とします。1行目は見出し行としたいので、書き込みの開始行は2行目とします。
スプレッドシートにイベントの情報を出力する
for eachループの中、スプレッドシートにイベント情報を出力する箇所ですが17~22行目の代わりに
mySheet.getRange(maxRow+1,1).setValue(maxRow); //イベントNo mySheet.getRange(maxRow+1,2).setValue(evt.getTitle()); //イベントのタイトル mySheet.getRange(maxRow+1,3).setValue(evt.getStartTime()); //イベントの開始時刻 mySheet.getRange(maxRow+1,4).setValue(evt.getEndTime()); //イベントの終了時刻
とします。
getRangeメソッドで書き込むセルの場所を指定して、それに対してsetValueメソッドで値を指定していきます。
A列から順番に、No、タイトル、開始時刻、終了時刻と入力されます。
イベントの所要時間を算出する
上記に追加して、イベントの所要時間も5列目のE列に算出しておきたいと思います。
終了時刻から開始時刻を減算すればよいですから、数式を入力するメソッドsetFormulaR1C1を用いて
mySheet.getRange(maxRow+1,5).setFormulaR1C1("=RC[-1]-RC[-2]"); //所要時間を計算
とすればOKです。
スプレッドシートへの出力を実行
以上をまとめると、スクリプトはこちらになります。
/* 指定月のカレンダーからイベントを取得する */ function getCalendar() { var mySheet=SpreadsheetApp.getActiveSheet(); //シートを取得 var maxRow=mySheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得 var myCal=CalendarApp.getCalendarById('カレンダーID'); //特定のIDのカレンダーを取得 var date='2016/02/01 00:00:00'; //対象月を指定 var startDate=new Date(date); //取得開始日 var endDate=new Date(date); endDate.setMonth(endDate.getMonth()+1); //取得終了日 var myEvents=myCal.getEvents(startDate,endDate); //カレンダーのイベントを取得 /* イベントの数だけ繰り返してシートに記録 */ for each(var evt in myEvents){ mySheet.getRange(maxRow+1,1).setValue(maxRow); //イベントのタイトル mySheet.getRange(maxRow+1,2).setValue(evt.getTitle()); //イベントのタイトル mySheet.getRange(maxRow+1,3).setValue(evt.getStartTime()); //イベントの開始時刻 mySheet.getRange(maxRow+1,4).setValue(evt.getEndTime()); //イベントの終了時刻 mySheet.getRange(maxRow+1,5).setFormulaR1C1("=RC[-1]-RC[-2]"); //所要時間を計算 maxRow++; } }
こちらを実行してみると
となります。
んー、ちょっとパッと見では見づらいですね。
スプレッドシートのセルの表示形式を変更する
C列からE列までの表記が見づらいので、表示形式を変更します。
まずC,D列に関しては秒の単位は不要ですので削除をしていきます。
C,D列を選択した状態でスプレッドシートのメニューから「表示形式」→「数字」→「表示形式の詳細設定」→「その他に日付と時刻の形式」を選択します。
「秒」はクリックするとメニューが表示されますので「削除」を選択。コロンは普通に delete キーで削除して「適用」です。
次にE列ですがこちらは経過時間の表示にしたいので、メニューから「表示形式」→「数字」→「経過時間」です。秒の表記も邪魔であれば、C,D列の表示形式の変更と同様に秒とコロンを削除してください。
結果としてこのような表示になります。
見やすくなりましたね。
まとめ
当ブログをたくさんご覧いただいている皆さまにはおさらい的な内容でしたが、これにてGoogleカレンダーの特定の月のイベントをスプレッドシートに出力することができました。
また、スプレッドシートのセルの表示形式の設定により見やすくなりました。
次回ですが、これらのイベント一覧を種類別に集計をしていきたいと思います。
どうぞお楽しみに!