以下の記事を参照。
Last active
July 1, 2023 16:59
-
-
Save W-Yoshida/755156e0ba60e2bfa6dfa2c2e09e733d to your computer and use it in GitHub Desktop.
Googleカレンダーの予定を取得・一括変更するGAS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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