簡體   English   中英

當 Google 表格中的單元格更新時,如何自動更新或自動刪除 Google 日歷事件?

[英]How to Auto-Update or Auto-Delete Google Calendar Events when Cells are Updated in the Google Sheet the Event is Created From From?

我已經查看了看似類似問題的其他答案,但尚未找到解決方案。 我目前正在使用以下腳本(感謝大量幫助!)從工作簿中的多個工作表自動填充事件; 然而,我也希望實現:

  1. 如果 C4:F24 中預先存在的數據發生更改,日歷中的事件會自動更新(沒有創建重復的事件)
  2. 如果單元格 E4:F24 中的數據被刪除,則事件將刪除。

我已經啟用了“onEdit”觸發器; 但是,它不允許上述任何一種情況。 任何幫助都非常感謝! 我已更新腳本以反映我目前正在測試的內容。 當安裝的“OnEdit”觸發器運行時,此腳本返回以下錯誤:ReferenceError: e is not defined at simpleSheetsToCalendar(Code:4:17)

 function simpleSheetsToCalendar() { var sheetNames = ["Oct-08-2021 | Plan", "Oct-15-2021 | Plan"]; // Please set the sheet names you want to use. var calendarId = "myCalendar"; // Please set your calendar ID. var {range} = e; var sheet = range.getSheet(); if (!(sheetNames.includes(sheet.getSheetName()) && range.rowStart >= 4 && range.rowEnd <= 24 && range.columnStart >= 3 && range.columnStart <= 6)) return; // 1. Retrieve all events from the Calendar and create an object for checking the duplicated titles. var events = []; var pageToken = ""; do { var res = Calendar.Events.list(calendarId, {maxResults: 2500, fields: "nextPageToken,items(id,summary,start(dateTime),end(dateTime))", pageToken}); events = events.concat(res.items); pageToken = res.nextPageToken; } while(pageToken); var obj = events.reduce((o, e) => Object.assign(o, {[e.summary]: e}), {}); // 2. Retrieve sheets from a Google Spreadsheet and retrieve the values from "C4:F24", and create an object for creating new events, deleting events and updating events. var values = sheet.getRange("C4:F24").getValues().reduce((o, [title,,startTime,endTime]) => { if (!obj[title] && title && startTime && endTime && !o[title]) { o.add[title] = {startTime, endTime}; } else if (obj[title] && title && startTime && endTime) { if (new Date(obj[title].start.dateTime).getTime() != startTime.getTime() || new Date(obj[title].end.dateTime).getTime() != endTime.getTime()) { obj[title].start.dateTime = startTime; obj[title].end.dateTime = endTime; o.modify.push(obj[title]); } } else if (obj[title] && title && !startTime && !endTime) { o.remove.push(obj[title].id); } return o; }, {add: {}, remove: [], modify: []}); // 3. Create new events. var eventCal = CalendarApp.getCalendarById(calendarId); var ar = Object.entries(values.add); if (ar.length > 0) { ar.forEach(([title, {startTime, endTime}]) => eventCal.createEvent(title, startTime, endTime)); } // 4. Modify events. if (values.modify.length > 0) { values.modify.forEach(({id, start, end}) => eventCal.getEventById(id).setTime(start.dateTime, end.dateTime)); } // 5. Delete events. if (values.remove.length > 0) { values.remove.forEach(id => eventCal.getEventById(id).deleteEvent()); } }

從你下面的問題和你的回答來看,

  • 如果 C4:F24 中預先存在的數據發生更改,日歷中的事件會自動更新(沒有創建重復的事件)
  • 如果單元格 E4:F24 中的數據被刪除,則事件將刪除。

根據你的情況,我的理解如下。

  • 您希望在編輯規格表的單元格“C4:C24”時自動執行腳本。
  • 當列“E”和“F”更改而“C”列具有值時,您希望更改事件的開始和結束時間。
  • 當單元格“E4:F24”被刪除而單元格“C4:C24”未被刪除時,您希望從日歷中刪除事件。

在這種情況下,以下流程如何?

  1. 從日歷中檢索所有事件並創建一個用於檢查重復標題的對象。
  2. 從 Google 電子表格中檢索表格並從“C4:F24”中檢索值,並創建用於創建新事件、刪除事件和更新事件的對象。
  3. 找到新標題后,創建新事件。
  4. 當標題存在並且開始和結束時間更改時,修改事件。
  5. 當標題存在並且開始和結束時間被刪除時,刪除事件。

並且,為了執行腳本,在這種情況下,使用了可安裝的 OnEdit 觸發器。 因為使用了日歷 API。 當此流程反映在您的腳本中時,它將變為如下所示。

修改后的腳本:

在此示例腳本中,為了檢索日歷事件的所有標題,使用了日歷 API。 因此,在您使用此腳本之前, 請在 Advanced Google services 中啟用 Calendar API 並且,請設置sheetNamescalendarId

此外, 請將可安裝的 OnEdit 觸發器安裝到函數simpleSheetsToCalendar

function simpleSheetsToCalendar(e) {
  var sheetNames = ["Sheet1", "Sheet2",,,]; // Please set the sheet names you want to use.
  var calendarId = "calendarId"; // Please set your calendar ID.
  var {range} = e;
  var sheet = range.getSheet();
  if (!(sheetNames.includes(sheet.getSheetName()) && range.rowStart >= 4 && range.rowEnd <= 24 && range.columnStart >= 3 && range.columnStart <= 6)) return;

  // 1. Retrieve all events from the Calendar and create an object for checking the duplicated titles.
  var events = [];
  var pageToken = "";
  do {
    var res = Calendar.Events.list(calendarId, {maxResults: 2500, fields: "nextPageToken,items(id,summary,start(dateTime),end(dateTime))", pageToken});
    events = events.concat(res.items);
    pageToken = res.nextPageToken;
  } while(pageToken);
  var obj = events.reduce((o, e) => Object.assign(o, {[e.summary]: e}), {});

  // 2. Retrieve sheets from a Google Spreadsheet and retrieve the values from "C4:F24", and create an object for creating new events, deleting events and updating events.
  var values = sheet.getRange("C4:F24").getValues().reduce((o, [title,,startTime,endTime]) => {
    if (!obj[title] && title && startTime && endTime && !o[title]) {
      o.add[title] = {startTime, endTime};
    } else if (obj[title] && title && startTime && endTime) {
      if (new Date(obj[title].start.dateTime).getTime() != startTime.getTime() || new Date(obj[title].end.dateTime).getTime() != endTime.getTime()) {
        obj[title].start.dateTime = startTime;
        obj[title].end.dateTime = endTime;
        o.modify.push(obj[title]);
      }
    } else if (obj[title] && title && !startTime && !endTime) {
      o.remove.push(obj[title].id);
    }
    return o;
  }, {add: {}, remove: [], modify: []});

  // 3. Create new events.
  var eventCal = CalendarApp.getCalendarById(calendarId);
  var ar = Object.entries(values.add);
  if (ar.length > 0) {
    ar.forEach(([title, {startTime, endTime}]) => eventCal.createEvent(title, startTime, endTime));
  }

  // 4. Modify events.
  if (values.modify.length > 0) {
    values.modify.forEach(({id, start, end}) => eventCal.getEventById(id).setTime(start.dateTime, end.dateTime));
  }

  // 5. Delete events.
  if (values.remove.length > 0) {
    values.remove.forEach(id => eventCal.getEventById(id).deleteEvent());
  }
}
  • 運行此腳本時,將從日歷的所有事件列表和電子表格的值中檢索用於更新和刪除的事件。 並且,當“E”和“F”列的值改變時,具有“C”列標題的事件被更新。 當列“E”和“F”的值為空時,刪除標題為“C”列的事件。

筆記:

  • 在這個答案中,根據您的問題,它假設當刪除“E”和“F”列的值時,“C”列標題的值存在。 請注意這一點。

  • 在這個修改后的腳本中,當規格表的單元格“C4:F24”出現時,腳本會自動執行。 因此,當您直接運行該函數時,會出現類似Cannot destructure property 'range' of 'e' as it is undefined.類的錯誤Cannot destructure property 'range' of 'e' as it is undefined. 發生。 運行腳本時,請編輯sheetNames特定工作表的單元格“C4:F24”。 請注意這一點。

  • 請確認您的工作表名稱。 請注意這一點。

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM