Apps 脚本:批量创建日历事件而不创建重复项

Apps Script: Batch Create Calendar Events without Creating Duplicates

我正在编写一个脚本,该脚本从 Google 工作表中获取任务列表并自动在 Google 日历上创建事件,将事件放在团队成员的日历上任务已申请。

一切正常,现在我的问题是我希望能够在添加任务时在整个单元格范围内 运行 脚本,而不创建重复事件。

我尝试使用这里描述的方法: 但这只会检查 event/task 名称,这对我不起作用,因为我可能会分配具有相同名称但不同日期等的任务

我的想法是创建一个额外的列,在创建事件后,代码在单元格中写入一个“X”,并且在代码执行时检查这个单元格,如果它已经有一个“ X”,该行将被跳过。但是我正在努力思考如何识别我需要写入的单元格。

基本上,我想遍历指定范围的行,如果“CalendarID”单元格包含一个值,您可以假设创建了一个事件,因此在下一个单元格中,写一个“X ”。剩下的只是一个简单的 if 语句来检查“X”。

My input data

任何人都可以建议如何做到这一点?或者替代策略? (这是我第一次尝试使用 Apps Script/JS)

非常感谢。

当前代码:

  function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:H").getValues();
for (x=0; x<myRange.length;x++)
{
    var myRow = myRange[x];
    var calendarID = myRow[3];

    if(calendarID){
      var eventCal = CalendarApp.getCalendarById(calendarID);
      var task= myRow[0];
      var startTime = myRow[1];
      var endTime = myRow[2];
      var existingEvents=Calendar.Events.list(calendarID);
      var eventArray=[]; 
      existingEvents.items.forEach(function(e){eventArray.push(e.summary)});
        if(eventArray.indexOf(task)==-1){ 
        eventCal.createEvent(task, startTime, endTime);
            }else{
      Logger.log('event exists already');
    }
    }

}

(我认为)我正在尝试去哪里(查看评论)

  function scheduleTasks() {
var spreadsheet = SpreadsheetApp.getActiveSheet();
var myRange = spreadsheet.getRange("E9:H").getValues();
for (x=0; x<myRange.length;x++)
{
    var myRow = myRange[x];
    var calendarID = myRow[3];

    if(calendarID){
      //if cell in "Scheduled" column, row x is false
      var eventCal = CalendarApp.getCalendarById(calendarID);
      var task= myRow[0];
      var startTime = myRow[1];
      var endTime = myRow[2];
      eventCal.createEvent(task, startTime, endTime);
      //write "X" in cell in "Scheduled" column, Row x
    }

}
}

你的情况,下面的修改怎么样?

修改后的脚本 1:

在此示例脚本中,X 的值被放入“计划”列。

function scheduleTasks() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var myRange = spreadsheet.getRange("E9:I" + spreadsheet.getLastRow()).getValues();
  var rangeList = [];
  for (x = 0; x < myRange.length; x++) {
    var myRow = myRange[x];
    var calendarID = myRow[3];
    var scheduled = myRow[4];
    if (calendarID && scheduled != "X") {
      var eventCal = CalendarApp.getCalendarById(calendarID);
      var task = myRow[0];
      var startTime = myRow[1];
      var endTime = myRow[2];
      eventCal.createEvent(task, startTime, endTime);
      rangeList.push(`I${x + 9}`)
    }
  }
  if (rangeList.length == 0) return;
  spreadsheet.getRangeList(rangeList).setValue("X");
}
  • 当此脚本为运行时,当“calendarID”存在且“Scheduled”列没有值“X”时,if 语句中的脚本为运行。在这种情况下,为了放置“X”的值,我使用了RangeList。

修改脚本 2:

在此示例脚本中,事件 ID 的值放在“已安排”列中。

function scheduleTasks() {
  var spreadsheet = SpreadsheetApp.getActiveSheet();
  var lastRow = spreadsheet.getLastRow();
  var myRange = spreadsheet.getRange("E9:I" + lastRow).getValues();
  var scheduledAr = [];
  for (x = 0; x < myRange.length; x++) {
    var myRow = myRange[x];
    var calendarID = myRow[3];
    var scheduled = myRow[4];
    if (calendarID && !scheduled) {
      var eventCal = CalendarApp.getCalendarById(calendarID);
      var task = myRow[0];
      var startTime = myRow[1];
      var endTime = myRow[2];
      var event = eventCal.createEvent(task, startTime, endTime);
      scheduledAr.push([event.getId()]);
    } else {
      scheduledAr.push([scheduled]); // Modified
    }
  }
  spreadsheet.getRange("I9:I" + lastRow).setValues(scheduledAr);
}
  • 当此脚本为运行时,当“calendarID”存在且“Scheduled”列没有值时,if 语句中的脚本为运行。在这种情况下,为了放置事件 ID 的值,我使用了 setValues.

参考文献: