googleカレンダーの予定をスプレッドシートにガバっと出力するスクリプトまとめ!
Googleカレンダーにびっしりと入力した予定をまとめてテキストデータで扱いたい時は、スプレッドシートのGASソースコードを作ることで、丸ごとガバッと出力できます。
本記事では、その具体的なソースコードを掲載していますので、使いたい方は、ぜひ参考にしてみてください。
目次
今回作ったスクリプト
やりたいこと
今回、グーグルカレンダーに登録している「カレンダー(1種類)」を選択して、そのカレンダーの中に登録しているスケジュール(イベント)について、スプレッドシートにすべてテキストとして書き出すという、Google Apps Script(以降、GAS)のスクリプトを作成しました。
ソースコード
下記の通り。
/* 指定月の特定カレンダーからイベントすべてを取得してスプレッドシートに書き出す */
function getCalendar() {
var mySheet=SpreadsheetApp.getActiveSheet(); //シートを取得
var RANGE = 2; // スプレッドシート:開始位置
var FORMAT_TIME = 'mm/dd hh:mm'; // スプレッドシート
var no=1;//No
var myCal=CalendarApp.getCalendarById('取得したいカレンダーID'); //特定IDのカレンダーを取得
var date='2017/12/01 00:00:00'; //対象月を指定
var startDate=new Date(date); //取得開始日
var endDate=new Date(date);
endDate.setMonth(endDate.getMonth()+1); //取得終了日(自動計算)
var schedules = myCal.getEvents(startDate,endDate); //予定オブジェクトの生成
// 予定を繰り返し出力する
for(var index = 0; index < schedules.length; index++) {
var range = RANGE + index;
// IDを出力
mySheet.getRange(range, 1).setValue(no);
// カレンダー名を出力
mySheet.getRange(range, 2).setValue(myCal.getName());
// 予定名を出力
mySheet.getRange(range, 3).setValue(schedules[index].getTitle());
// 開始時間を出力
mySheet.getRange(range, 4).setValue(schedules[index].getStartTime()).setNumberFormat(FORMAT_TIME);
// 終了時間を出力
mySheet.getRange(range, 5).setValue(schedules[index].getEndTime()).setNumberFormat(FORMAT_TIME);
// 稼働時間を出力
mySheet.getRange(range, 6).setValue("=INDIRECT(\"RC[-1]\",FALSE)-INDIRECT(\"RC[-2]\",FALSE)");
// イベント内容を出力
mySheet.getRange(range, 7).setValue(schedules[index].getDescription()).setNumberFormat(FORMAT_TIME);
no++;
}
} // end function
出力結果
11月のうち、予定1というカレンダーに、「イベント名1」と「イベント名2」というスケジュールがあった場合、こんな感じに出力されます。
自分が出力した要素はこちら。
A列⇒取得した予定の数(ID)
B列⇒取得したカレンダー名
C列⇒取得したカレンダー配下の予定
D列⇒取得した予定の開始時刻
E列⇒取得した予定の終了時刻
F列⇒D列からE列を差分した稼働時間
G列⇒取得した予定に書いてあるメモ内容
C列にはフィルター埋めてて、テキスト出力した後、並べ替えて確認できるようにしています。自分は特定の予定について、一ヵ月でどれだけ稼働していたのかを一覧にしたかったので、こういった形式で作成しました。(1行目部分は、スプレッドシート側で作成しています。自分の使いやすいようにカスタマイズしてもらえればと思います。)
ソースの使い方解説
まずはgasスクリプトをスプレッドシートに記述しましょう。スプレッドシートを作成してメニューバーの「ツール>スクリプトエディタ」を開きます。
スクリプトエディタが開くので、function内に先ほどのソースコードをコピペします。
コピペした後は、ちょっとだけ設定をイジります。
まず、10行目 var myCalの文字列部分(サンプルでは'取得したいカレンダーID'の部分)に、自分が取得したいカレンダーIDを入力します。
カレンダーIDは、googleカレンダーの設定画面から調べることができます。
カレンダーIDを入力した後は、12行目のvar dateの文字列部分(サンプルでは'2017/12/01 00:00:00'の部分)で、取得したい月を入力します。今月から2018年になるので、西暦の修正もお忘れなく。
これでOKです。あとは、スクリプト画面の再生マークを押すと、スクリプトが起動して、指定した月における指定したカレンダーIDの予定をすべてスプレッドシートに書き出してくれます。
ちなみに出力する日時フォーマットを変更したい場合は、6行目のvar FORMAT_TIMEをいじりましょう。
スクリプト動作時の確認動作
GASスクリプトを起動すると、「このスクリプト、本当に動かして良いのかい??」という確認で、再度ログインなどを促されますので、問題なければYesを選択します。(このスクリプトはGoogleに認定されておらず危険な可能性があります、の部分は、左下の詳細などを押していくと、「このスクリプトを構わず動かす」といったリンクテキストが出てくるので、それをクリックすればOK。)
ただ、本当に害意あるプログラムをOKしてしまうと危険なので、インターネットから拾ったソースはきちんと中身を確認してから使うようにしましょう。(本記事のソースコードも害意はないはずですが、そういう書き手側の発言を安易に信じず、自分の目でしっかりご確認お願いします。)
その他・補足
出力する予定を2種類にできる?
可能です。ただ、一つのオブジェクトに複数の予定を入力できないようなので、下記のようにやります
・10行目のmyCalを増やす。
⇒myCal2などにして、もう一つのカレンダーIDを埋める。
・17行目のvar schedulesを増やす。
⇒schedules2などにして、先ほどのmyCal2を埋める。
・for分をもう一個追加する
⇒for分ガバッとコピペして、schedulesをschedules2にしつつ、21行目のID用のvar rangeを調整してください。(1回目のループ内容を引き継ぐようにする。)
もしかしたら、一つのオブジェクトに複数のカレンダーを配列みたいにして扱えるのかもしれないのですが、自分は必要なかったので、そこまで調べず・・・。もし調べた人いれば、報告して頂けるか、記事にしてもらえると、すごく助かります!
スクリプトは純正のスプレッドシートで操作しないと時間のエラーが起きる可能性あり!
本記事のGASコードは、G-Drive上で作成したスプレッドシートだけで使うようにしてください。ローカルのエクセルを用いて変換したスプレッドシートだと、タイムスタンプでエラーが起きる場合があります。
自分の場合、
「ローカルのエクセルファイルをG-Driveにアップロード⇒G-driveでスプレッドシートに変換⇒本記事のGASコードを埋め込み⇒動作」
というようにしたら、取得した予定の開始時間と終了時間が、すべて16時間ずつズレるエラーに遭遇しました。スプレッドシートのなんかしらの設定を修正すれば治るのだとは思いますが、いちいち面倒なので、GASコードはローカル⇔G-Driveの間で変換処理をしていないファイルを利用するようにしましょう。(純正スプレッドシートが好ましい。)
参考リンク
今回、作成にあたり、参考にしたサイト様のソースをたくさん流用させて頂きましたので、GASについてさらに詳しく知りたい方は、下記URLをご参照ください。
※参考リンク
▼Google Apps ScriptでGoogleカレンダーの記録をスプレッドシートに出力する
https://tonari-it.com/gas-calendar-spreadsheet/
⇒こちらのサイト様はGASについて、とても詳しく書かれています。参考・・・というか、ほとんどソース流用させて頂きました。(申し訳ございません・・・そして素晴らしい記事、本当にありがとうございます・・・!)
▼googleカレンダーから予定を取得する
https://qiita.com/n_sekiya/items/903114a3f7c808702c8e
⇒先ほどの記事の「each appendrow」の方法で出力すると、セル挿入の処理が入る分、全体の処理動作が遅くなる+セルの表示形式を固定にしておけない問題があったので、こちらの記事さまの「セルに値を書いていく部分のソース」を流用させて頂きました。
▼GoogleAppsScriptで日付をフォーマットする
https://qiita.com/yasuyuki_tsuda/items/11e882076e2dc9fdee16
⇒日付の改良で参考にさせて頂きました。
公式リファレンスは素晴らしい!
GASで困ったことがあった際は、Googleさんの公式リファレンスページを見て調べれば、だいたいなんとかなります。全文英語ですが、右クリック⇒日本語に翻訳をすると、かなり綺麗な日本語にしてくれますので、とても読みやすいです。
▼Google Apps Script(REFERENCE)
https://developers.google.com/apps-script/reference/calendar/
有料サービスのGcal2Excelもあります!
海外サービスになりますが、グーグルカレンダーの予定をエクセル出力する「gcal2excel」という、webサービスもあります。
サイト閲覧の際は、右クリック、日本語に翻訳とすると、英語もあまり気になりません。試用30日間と、無料プランもあるので、試してみては。
参考記事
▼Googleカレンダーのデータをエクセルに変換する「Gcal2Excel」が便利すぎる
https://orezinal.com/150033
まとめ
いかがでしたでしょうか。
グーグルカレンダーに記載している予定をcsvでガバっと出力したいという方は、ぜひ参考にしてみてください。