Skip to content

Instantly share code, notes, and snippets.

@W-Yoshida
Last active July 1, 2023 16:59
Show Gist options
  • Save W-Yoshida/755156e0ba60e2bfa6dfa2c2e09e733d to your computer and use it in GitHub Desktop.
Save W-Yoshida/755156e0ba60e2bfa6dfa2c2e09e733d to your computer and use it in GitHub Desktop.
Googleカレンダーの予定を取得・一括変更するGAS
var ss = SpreadsheetApp.getActiveSpreadsheet();
var listEventSheet = ss.getSheetByName("イベント一覧取得");
var updateEventSheet = ss.getSheetByName("イベント更新");
//実行メニューを作成
function onOpen() {
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu("GAS実行");
menu.addItem("イベント取得", "listEvent");
menu.addItem("イベント更新", "modifyEvent");
menu.addToUi();
}
function listEvent(){
var lastColum = listEventSheet.getLastColumn();
var lastRow = listEventSheet.getLastRow();
var startRow = 4;
var dataColumnCount = 9;
var dataCount = 0;
//イベントを取得する対象のカレンダーIDを取得
var strCalendarID = listEventSheet.getRange(1,2).getValue();
//シートのリスト出力部をクリア
listEventSheet.getRange(startRow, 1, listEventSheet.getLastRow(), dataColumnCount).clear();
//予定の一覧(将来の分のみ)を取得
//停止ユーザーのカレンダーを指定してもエラーになるので注意
var eventList = Calendar.Events.list(strCalendarID, {
timeMin: new Date().toISOString(),
singleEvents: false,
//orderBy: "startTime", //"orderBy"は"singleEvents"がtrueでないと使用できない
maxResults: 1000 //APIの上限は2500
});
var values = [];
if(eventList){
for(var i = 0; i < eventList.items.length; i++){
//まれに予定ではないレコードが含まれるので、"htmlLink"が存在しないレコードはスキップする
if(!eventList.items[i].htmlLink)
{
continue;
}
var value = [];
var strDate = ''
var strStartTime = ''
//終日予定の場合は"event.start.date"を、通常の予定の場合は"event.start.dateTime"を保持している
if(eventList.items[i].start.dateTime){
var startDate = new Date(eventList.items[i].start.dateTime);
//var startDate = eventList.items[i].start.dateTime;
//getMonthは0~11を返すので1を加算
var strMonth = startDate.getMonth() + 1;
//"時"の頭0が省略されるので付与
var strHour = startDate.getHours();
if(strHour < 10){
strHour = '0' + strHour;
}
//"分"の頭0が省略されるので付与
var strMinute = startDate.getMinutes();
if(strMinute < 10){
strMinute = '0' + strMinute;
}
strDate = startDate.getFullYear() + '-' + strMonth + '-' + startDate.getDate();
strStartTime = strHour + ':' + strMinute;
}
else
{
strDate = eventList.items[i].start.date;
}
value.push(strDate);
value.push(strStartTime);
value.push(eventList.items[i].summary);
value.push(eventList.items[i].organizer.email);
value.push(eventList.items[i].visibility);
value.push(eventList.items[i].guestsCanModify);
value.push(eventList.items[i].recurrence);
value.push(eventList.items[i].recurringEventId);
value.push(eventList.items[i].id);
values.push(value);
dataCount++;
}
values.sort();
//取得したデータをスプレッドシートにセット
listEventSheet.getRange(startRow, 1, dataCount, dataColumnCount).setValues(values);
}
}
function modifyEvent(){
var lastColum = updateEventSheet.getLastColumn();
var lastRow = updateEventSheet.getLastRow();
var startRow = 2;
var numRows = lastRow - 1;
var dataRange = updateEventSheet.getRange(startRow, 1, numRows, lastColum);
var data = dataRange.getValues();
for (var i = 0; i < data.length; ++i) {
var row = data[i];
row.rowNumber = i + startRow;
//Result列がブランクであれば処理を実行
if (!row[2]) {
var result = "";
var strCalendarID = row[0];
var strEventID = row[1];
try
{
//対象のイベントを取得
var event = Calendar.Events.get(strCalendarID,strEventID);
//オーナーを変更
//event.organizer.email = row[2];
//「ゲストの変更を許可」をON
event.guestsCanModify = true;
//イベントを更新
Calendar.Events.patch(event, strCalendarID, strEventID);
result = "Success";
}catch(e){
result = "Error:" + e;
}
//実行結果をResult列にセット
updateEventSheet.getRange(row.rowNumber, 3).setValue(result);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment