Auto-create google 工作簿中多个工作表的日历事件使用触发器且不创建重复事件

Auto-create google calendar events from multiple sheets in a workbook using a trigger and without creating duplicate events

我在这里一无所知,所以非常感谢任何帮助。我的应用程序脚本代码很草率,是从在线示例中拼凑而成的。我知道这是垃圾,不能满足我的大部分需求。这就是我来这里的原因。我的目标是 auto-populate google 来自工作簿中多个 sheet 的日历事件并创建触发器,以便在任何时候在这些单元格中编辑内容时填充新事件(或编辑事件)但不会创建重复事件。

我将从中提取数据的单元格对于每个 sheet 都是相同的: C4:C24(这些单元格包含事件的标题)和 E4:F24(这些单元格分别包含开始日期和时间以及结束日期和时间)。

我设置的触发器处于编辑状态,但是当我进行编辑时,每次都会创建重复的事件,这是我不想要的。

非常感谢任何帮助。谢谢!

// function to retrieve data from Sheet and add to Calendar 
function simpleSheetsToCalendar() { 

// get spreadsheet 
var spreadsheet = SpreadsheetApp.getActiveSheet(); 
var eventCal = 
CalendarApp.getCalendarById('actualCalendarId');  
var signups = spreadsheet.getRange("C4:F24").getValues();
for (x=0; x<signups.length;x++)
{
var shift = signups[x];
var task= shift[0];
var startTime = shift[2];
var endTime = shift[3];
eventCal.createEvent(task, startTime, endTime);} }

我相信你的目标如下。

  • 您想从 Google 电子表格的多个工作表中的单元格“C4:F24”中检索值。
    • “C”、“E”、“F”列分别是事件标题、开始时间和结束时间。
  • 您想使用检索到的值在 Google 日历中创建一个新事件。那时,您不想创建重复的事件标题。

示例脚本:

在此示例脚本中,为了检索日历事件的所有标题,使用了日历 API。所以在你使用这个脚本之前,please enable Calendar API at Advanced Google services。并且,请设置 sheetNamescalendarId

function simpleSheetsToCalendar() {
  var sheetNames = ["Sheet1", "Sheet3",,,]; // Please set the sheet names you want to use.
  var calendarId = "###"; // Please set your calendar ID.

  // 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(summary)", pageToken});
    events = events.concat(res.items);
    pageToken = res.nextPageToken;
  } while(pageToken);
  var obj = events.reduce((o, e) => Object.assign(o, {[e.summary]: true}), {});

  // 2. Retrieve sheets from a Google Spreadsheet and retrieve the values from "C4:F24", and create an object for creating new events.
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var values = spreadsheet.getSheets().reduce((o, sheet) => {
    if (!sheetNames.includes(sheet.getSheetName())) return o;
    var signups = sheet.getRange("C4:F24").getValues();
    signups.forEach(([title,,startTime,endTime]) => {
      if (!obj[title] && title && startTime && endTime && !o[title]) o[title] = {startTime,endTime};
    });
    return o;
  }, {});

  // 3. Create new events.
  var ar = Object.entries(values);
  if (ar.length == 0) return;
  var eventCal = CalendarApp.getCalendarById(calendarId);
  ar.forEach(([title, {startTime, endTime}]) => eventCal.createEvent(title, startTime, endTime));
}
  • 当此脚本为 运行 时,将检索日历中的所有事件标题,并从 Google 电子表格中多个工作表上的“C4:F24”检索值。然后,通过检查重复的标题创建新事件。

注:

  • 在此示例脚本中,检查事件标题以检查重复的事件。如果要查看其他属性,请修改上面的示例脚本。

参考文献: