首页 > 解决方案 > 使用触发器从工作簿中的多个工作表自动创建谷歌日历事件,而无需创建重复事件

问题描述

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

我要从中提取数据的单元格对于每个工作表都是相同的: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-apps-scriptgoogle-sheetstriggersgoogle-calendar-api

解决方案


我相信你的目标如下。

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

示例脚本:

在此示例脚本中,为了检索日历事件的所有标题,使用了 Calendar API。因此,在您使用此脚本之前,请在 Advanced Google services 中启用 Calendar API。并且,请设置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”检索值。然后,通过检查重复的标题来创建新事件。

笔记:

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

参考:


推荐阅读