Google Apps Script(略してGASというらしい)の情報はこれまでもインターネット上で見る機会があったのだけど、Googleは検索エンジンとメールしか使っておらず、しかもメールに関してはサブもサブのメールアドレスといった位置づけ。Googleのアプリにお世話になることはきっとないだろう、と思っていた。
だけど最近、会社でGoogleアプリを使うことが禁止されていない、ということを知って、活用方法を考え始めている。 まずは、会社用のgmailアドレスの登録して比較的簡単なことから始める。
- GoogleMapsによく使うレストランなどを登録。
- GooglePhotosに写真をバックアップ1。
ここまでは設定の問題なので、敷居が低い。次のステップは、Google Apps Scriptを用いて自分専用の便利機能を作る。
多くの人たちが取り組んでいるのが、Spreadsheetで作成した予定一覧をCalendarへ一括登録する、というもの。確かに便利そうである。便利そうであるが、私、仕事で使ってるのは、Outlookなんだよなー。ということで、Google Calendarへ登録後は、Outlook CalendarへのSyncの設定も必要そうである。
Contents
初心者の私にも理解できたGAS解説サイト
Google Apps Scriptの基本も分からない私が参考にしたのは次のサイト。非常にわかりやすい。
特に参考にした記事
- 【コピペでOK!】Google apps scriptでカレンダーに登録しよう!-終日編-
- 【直ぐに使える】Google apps scriptからカレンダー登録|-期間指定編-
- 5分で出来る|Google apps scriptからカレンダーへイベントの場所・説明を登録する3つの手順
- 【コピペでOK!】スプレッドシートとカレンダーを連携してイベントを一括登録する方法
上記の最後「【コピペでOK!】スプレッドシートとカレンダーを連携してイベントを一括登録する方法」に載っているコードで私がやりたいことの95%は達成。
事前準備
デフォルトのカレンダーではなく予定のカテゴリー登録したいと考えていたので、Google・Outlookいずれでも新たにカレンダーを作成した。(今回作ったのは《OOO》2というカレンダー。ミーティングで聞いた上司や同僚たちの出張・休暇日程を登録しておこうかな、と。)
全日・時間指定のイベントどちらも同じシートから一括登録
モノグサな私が必要としているのは、ひとつのシートで、全日イベントと時間指定のイベントの両方を登録すること。なので、データテーブルを以下のようにして、紹介されているコードをほんの少し変更してみた。
全日の予定の場合には、【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を閉じる |
もっと上手な書き方あるのだろうけど、とりあえずこれで私のやりたかったことは出来たので、現状は良し。
コード修正
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を介さずに完結出来たら良いのだけど、現時点の私のスキルでは難しい。
- iCloud追加ストレージ問題も解消されるかもしれません(2018年2月現在、50GBで月額130円)。私はそれほど写真撮らないけど。 ↩︎
- 「Out of Office(不在)」カレンダー ↩︎