とうとうGASデビュー:スプレッドシートからカレンダーへ予定を登録

Google Apps Script(略してGASというらしい)の情報はこれまでもインターネット上で見る機会があったのだけど、Googleは検索エンジンとメールしか使っておらず、しかもメールに関してはサブもサブのメールアドレスといった位置づけ。Googleのアプリにお世話になることはきっとないだろう、と思っていた。

だけど最近、会社でGoogleアプリを使うことが禁止されていない、ということを知って、活用方法を考え始めている。 まずは、会社用のgmailアドレスの登録して比較的簡単なことから始める。

  • GoogleMapsによく使うレストランなどを登録。
  • GooglePhotosに写真をバックアップ1

ここまでは設定の問題なので、敷居が低い。次のステップは、Google Apps Scriptを用いて自分専用の便利機能を作る

多くの人たちが取り組んでいるのが、Spreadsheetで作成した予定一覧をCalendarへ一括登録する、というもの。確かに便利そうである。便利そうであるが、私、仕事で使ってるのは、Outlookなんだよなー。ということで、Google Calendarへ登録後は、Outlook CalendarへのSyncの設定も必要そうである。

初心者の私にも理解できたGAS解説サイト

Google Apps Scriptの基本も分からない私が参考にしたのは次のサイト。非常にわかりやすい。

OYAKUDACHI.xyz

特に参考にした記事

上記の最後「【コピペでOK!】スプレッドシートとカレンダーを連携してイベントを一括登録する方法」に載っているコードで私がやりたいことの95%は達成。

事前準備

デフォルトのカレンダーではなく予定のカテゴリー登録したいと考えていたので、Google・Outlookいずれでも新たにカレンダーを作成した。(今回作ったのは《OOO》2というカレンダー。ミーティングで聞いた上司や同僚たちの出張・休暇日程を登録しておこうかな、と。)

全日・時間指定のイベントどちらも同じシートから一括登録

モノグサな私が必要としているのは、ひとつのシートで、全日イベントと時間指定のイベントの両方を登録すること。なので、データテーブルを以下のようにして、紹介されているコードをほんの少し変更してみた。

Push to Calendar Table

全日の予定の場合には、【All Day Event】列に《y》と入力。時間(【Start Time】・【End Time】)は入力しない。

/* カレンダーへイベントを登録する */
function pushToCalendar() {
//シートの項目を以下変数定義
var dSheet, Cal, i, Title, StartDate, StartTime, EndDate, EndTime, AllDayEvent, Description, Location, Status;
//dSheetを定義
dSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
//calendar variables
Cal = CalendarApp.getCalendarById("XXXXX.google.com"); //<---XXXXXを自分のgmailアドレスへ変更する
//シートの2行目〜最終行まで処理を繰り返す
for (i = 2; i <= dSheet.getLastRow(); i++) {
/*--スプレッドシートの値を取得して変数へ格納--*/
//i行1列目の値(Title)をTitleへ格納
Title = dSheet.getRange(i, 1).getValue();
//i行2列目の値(Start Date)をStartDateへ格納
StartDate = dSheet.getRange(i, 2).getValue();
//開始日をUtilities.formatDateでフォーマットしてbへ格納
var b = Utilities.formatDate(StartDate, "JST", "yyyy/MM/dd");
//i行3列目の値(Start Time)をStartTimeへ格納
var StartTime = dSheet.getRange(i, 3).getValue();
if (StartTime == "") {
//do nothing
} else {
//StartTimeの時間を取得してSHへ格納
var SH = StartTime.getHours();
//StartTimeの時間を取得してSMへ格納
var SM = StartTime.getMinutes();
//StartTimeの時間を取得してSSへ格納
var SS = StartTime.getSeconds();
//new Dateメソッドで開始日時「yyMMdd hh:mm」をStartへ格納
var Start = new Date(b + " " + SH + ":" + SM + ":" + SS);
}
//i行4列目の値(End Date)をEndDateへ格納
EndDate = dSheet.getRange(i, 4).getValue();
//終了日をUtilities.formatDateでフォーマットしてcへ格納
var c = Utilities.formatDate(EndDate, "JST", "yyyy/MM/dd");
//i行5列目の値(End Time)をEndTimeへ格納
var EndTime = dSheet.getRange(i, 5).getValue();
if (EndTime == "") {
//do nothing
} else {
//endtimeの時間を取得してH1へ格納
var EH = EndTime.getHours();
//endtimeの分を取得してM1へ格納
var EM = EndTime.getMinutes();
//endtimeの秒を取得してS1へ格納
var ES = EndTime.getSeconds();
//new Dateメソッドで終了日時「yyMMdd hh:mm」をEndへ格納
var End = new Date(c + " " + EH + ":" + EM + ":" + ES);
}
//i行目6列目の値(終日イベントかどうか)をAllDayEventへ格納(yなら終日イベント)
AllDayEvent = dSheet.getRange(i, 6).getValue();
//i行目7列目の値(Description)をDescriptionへ格納
Description = dSheet.getRange(i, 7).getValue();
//i行8列目の値(Location)をLocationへ格納
Location = dSheet.getRange(i, 8).getValue();
/*--カレンダーへ登録--*/
//i行9列目の値(イベント登録有無)をStatusへ格納
Status = dSheet.getRange(i, 9).getValue();
//Statusの値が空白だったらカレンダー登録を実行
if (Status == "") {
//指定のカレンダーIDへインベント登録
if (AllDayEvent == 'y' && b == c) {
Cal.createAllDayEvent(Title, StartDate, {
description: Description,
location: Location
});
dSheet.getRange(i, 9).setValue("Posted");
} else if (AllDayEvent == 'y' && b != c) {
Cal.createAllDayEvent(Title, StartDate, EndDate, {
description: Description,
location: Location
});
dSheet.getRange(i, 9).setValue("Posted");
} else {
Cal.createEvent(Title, Start, End, {
description: Description,
location: Location
}); //createEvent(タイトル、開始日時、終了日時、オプション)
//カレンダー登録が終わったイベントのStatusへ「Posted」を記入
dSheet.getRange(i, 9).setValue("Posted");
} //ifを閉じる
}
} //forを閉じる
} //functionを閉じる
view raw pushToCalendar.js hosted with ❤ by GitHub

もっと上手な書き方あるのだろうけど、とりあえずこれで私のやりたかったことは出来たので、現状は良し。

コード修正

2018.06.22)コードを書き換えた。こっちの方がスッキリ。

(2018.07.30) 更に修正。

Outlookへ登録:SyncじゃなくてFlowを使ってみた

Google CalendarとOutlookの連携方法もいくつか方法があるようだ。

 

Office 365を使っているなら、上記【Google Calendarを購読する】の方法とほぼ同じことがMS Flowを使っても出来る。

 

MS Flowを使って特定の添付書類をSharePointに格納するなど、Flowがお気にいりなので後者の方法でOutlookへ登録することにした。この方法だとクライアント変えても大丈夫なはず、多分。

今後の課題

同じシートで、編集や削除も出来たらいいかも、と思う。でも、それよりも盛り込みたいのは、同僚の名前や不在の種類(出張か休暇か)の列を作って、イベントタイトルの頭にその情報を付けることかも。 最終的には、《Google Spreadsheet》を使っている部分を《SharePointリスト》にしてGoogleを介さずに完結出来たら良いのだけど、現時点の私のスキルでは難しい。


  1. iCloud追加ストレージ問題も解消されるかもしれません(2018年2月現在、50GBで月額130円)。私はそれほど写真撮らないけど。 ↩︎
  2. 「Out of Office(不在)」カレンダー ↩︎