私の勤める会社では、GoogleCalendarで日々の行動、予定を共有しています。
この共有自体は非常に便利ですし、とやかく言うことはないのですが、最近、「予定に対する報告をカレンダーの説明欄に書き込まなければならない」というルールができてしまったのです。
もちろんカレンダーの予定と紐付けして報告を書き込むことは理にかなっていますし、出先でカレンダーを開いて、移動中などにパパッと書き込むことができるのは大変便利です。
ただ、場合によっては報告が非常に長くなりますし、1週間分の報告を一度にまとめて編集、整理したい、という時もあります。そんな時は「1予定ごとにカレンダーを開き、報告を書いたり修正していく」のは非常に手間がかかりますし、非効率的です。
毎日細かく書いていればそもそもそんなことにはならないだろ!と言うのは無しです・・・
そこで、GoogleAppsScript(GAS)の機能を使って
1.スプレッドシートにカレンダーの情報を読み込み内容を表示
2.スプレッドシート上で読み込まれた内容を編集
3.編集した内容をカレンダーに反映
という操作ができるようなスクリプトを組んでみました。
メリットとしては、
・全てスプレッドシート上で完結できる
・複数の日程をまとめて取得できるので、他の予定を見ながら報告を書ける
(Googleカレンダーでは他の予定を見ながら、、というのは難しいかと)
・他日程からコピペで内容を取ってこれる(重要)
といった点が挙げられるかなと
デメリットは
・プログラミング独学3日目の私が組んでみたガバガバプログラムだと言うこと
・そのため、現状では予定のタイトル、場所、説明欄しか編集できないこと でしょうか。
現状では、あくまで説明欄の記述修正特化のものだと思っていただければと思います。
スクリプト紹介
以下、スクリプト紹介です。めちゃくちゃ修正・効率化すべき箇所が多いと思うのですが、勘弁してください。
スプレッドシート
このような画面を用意しました。
D2に自分のメールアドレス
D3に取得開始日を
D4に開始日から何日分の予定を取ってくるか をそれぞれ記入します。
前述の通り、まだ編集できるのはタイトル、場所、内容だけですが、内容を記入する上での助けになるので、日付や時間も表示するようにしています。
スクリプトエディタ
下記、稚拙ながら書いてみたコードです。一応動きますし使えますよ!
function calendarToSs(){ | |
//シートを取得 | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var sheet = ss.getSheetByName('予定取得&更新'); | |
//シートからカレンダーID、開始日、期間を取得 | |
var calendarID = sheet.getRange('D2').getValue(); | |
var specifyDate = new Date(sheet.getRange('D3').getValue()); | |
var period = sheet.getRange('D4').getValue(); | |
//最終行のベースを獲得 | |
var lastRow = sheet.getLastRow(); | |
//カレンダーを取得 | |
var calendar = CalendarApp.getCalendarById(calendarID); | |
//日数分回す | |
var startRow = lastRow + 1; | |
var eventDate = ''; | |
var startTime = ''; | |
var endTime = ''; | |
var title = ''; | |
var location = ''; | |
//var guests = ''; ゲストの表示がうまくできないので、下記のようにEmailを表示させてます。。 | |
var detail = ''; | |
var eventID= ''; | |
var outDate = specifyDate; | |
for (var j = 0; j <period ; j++){ | |
//開始日のイベント取得 | |
var events = calendar.getEventsForDay(outDate); | |
var eventsNumber = events.length; | |
for (var i = 0 ;i<eventsNumber;i++){ | |
startTime = events[i].getStartTime(); | |
eventDate = startTime; | |
endTime = events[i].getEndTime(); | |
title = events[i].getTitle(); | |
location = events[i].getLocation(); | |
var guestsEmail = events[i].getGuestList(false).map(function(guest){return guest.getEmail()}); | |
detail = events[i].getDescription(); | |
eventID = events[i].getId(); | |
//スプレッドシートに出力 | |
sheet.getRange(startRow,2).setValue(startTime); | |
sheet.getRange(startRow,1).setValue(eventDate); | |
sheet.getRange(startRow,3).setValue(endTime); | |
sheet.getRange(startRow,4).setValue(title); | |
sheet.getRange(startRow,5).setValue(location); | |
sheet.getRange(startRow,6).setValue(guestsEmail); | |
sheet.getRange(startRow,7).setValue(detail); | |
sheet.getRange(startRow,8).setValue(eventID); | |
sheet.getRange(startRow,9).setValue(i +1); | |
startRow = startRow +1; | |
} | |
outDate.setDate(outDate.getDate('D3')+1); | |
//行列幅の調整、A~C列の表現型はシートの表示方法で調整しました | |
}; | |
} | |
function clear() { | |
//シートを取得 | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var sheet = ss.getSheetByName('予定取得&更新'); | |
//入力部の範囲を検索 | |
var startRow = 7; | |
var dataColumnCount = 9; | |
//シートのリスト出力部をクリア | |
sheet.getRange(startRow, 1, sheet.getLastRow(), dataColumnCount).clearContent(); | |
} | |
function modifyEvent(){ | |
//シートを取得 | |
var ss = SpreadsheetApp.getActiveSpreadsheet(); | |
var sheet = ss.getSheetByName('予定取得&更新'); | |
//シートからカレンダーIDを取得 | |
var calendarID = sheet.getRange('D2').getValue(); | |
//カレンダーを取得 | |
var calendar = CalendarApp.getCalendarById(calendarID); | |
//start | |
var lastColum = sheet.getLastColumn(); | |
var lastRow = sheet.getLastRow(); | |
var startRow = 7; | |
var dataRange = sheet.getRange(startRow, 1, lastRow, lastColum); | |
for (var i = 7; i <= lastRow; i++) { | |
//列毎に当日のイベントの中からI列を参照してイベントを特定する | |
var date = new Date(sheet.getRange(i,1).getValue()); | |
var events = calendar.getEventsForDay(date); | |
var targetNumber = sheet.getRange(i, 9).getValue(); //I列で特定する | |
var targetEvent = events[targetNumber-1]; | |
//var newStartTime = sheet.getRange(i, 2).getValue(); | |
//var newStartDateTime = date.setHours(newStartTime); | |
//var newEndTime = sheet.getRange(i, 3).getValue(); | |
//var newEndDateTime = date.setHours(newEndTime); setTimeが機能しない。。Timeに日付+時間を格納しないとダメ? | |
//targetEvent.setTime(newStartTime, newEndTime); | |
var newTitle = sheet.getRange(i, 4).getValue(); | |
targetEvent.setTitle(newTitle); | |
var newLocation = sheet.getRange(i, 5).getValue(); | |
targetEvent.setLocation(newLocation); | |
//var newGuest = sheet.getRange(i, 6).getValue(); | |
//targetEvent.(newGuest); //https://qiita.com/gohh56/items/496b4c0b0ddbb20fd7d6 これで追加できそうだが、そもそもメールアドレスでの追加は非現実的(カレンダーでやったほうがはやい) | |
var newDetail = sheet.getRange(i, 7).getValue(); | |
targetEvent.setDescription(newDetail); | |
} | |
} |
課題は下記の3つ
・参加者の名前をうまく取得したい(現状ではEmailでの取得になっている)
・時間帯や参加者も修正できるようにしたい(現状ではタイトル、場所、内容のみ)
・スプレッドシートに追加したイベント、削除したイベントもカレンダーに追加したい
これらが実現できれば、ある程度汎用性も出てくるはず・・・
現状では内容説明の修正にのみ特化していますので、のんびり改良していきますー
コメント