首页 > 解决方案 > 忽略空单元格并跳过 Google 表格/日历同步中的重复条目

问题描述

我正在尝试为 Google 表格编写脚本以同步到 Google 日历。我当前的障碍是试图让它读取列中的所有条目,如果我多次运行它,则忽略空单元格并且不重复条目。当我将 getRange 设置为覆盖空单元格的任何内容时,它会出错

例外:参数 (String,String,String) 与 CalendarApp.Calendar.createEvent 的方法签名不匹配。

虽然它仍然会创建条目,但我相信当他看到一个红色错误说出现问题时会担心的人。

另一个问题是每次脚本运行时,它都会重复从以前复制的条目。我该如何防止这种情况?

这是当前脚本。

        function onOpen() {
     var ui = SpreadsheetApp.getUi();
     var menu = ui.createMenu('Sync to Calendar');
     var item = menu.addItem('Commit', 'syncCalendar');
     item.addToUi();
    }

    function syncCalendar() {

      var spreadsheet = SpreadsheetApp.getActive();

      var calendarId = "*******";

      var eventCal = CalendarApp.getCalendarById(calendarId);

      var signups = spreadsheet.getRange("D3:F10").getValues();

      for (x=0; x<signups.length; x++) {

        var slot = signups[x];

        var startTime = slot[0];
        var endTime = slot[1];
        var name = slot[2];

        eventCal.createEvent(name, startTime, endTime);
      }
    }

标签: google-apps-script

解决方案


  • 您想删除问题中显示的错误。
    • 在这种情况下,空值包含在signups. 您想忽略这些空值。
  • 您不想创建重复的事件。

如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

修改点:

  • 为了忽略空值,在这种情况下,if (name && startTime && endTime) {}使用。
  • 为了避免创建重复的事件,if (!eventCal.getEvents(startTime, endTime)) {}使用。

当这些反映到你的脚本中时,它变成如下。

修改后的脚本:

从:
for (x=0; x<signups.length; x++) {

  var slot = signups[x];

  var startTime = slot[0];
  var endTime = slot[1];
  var name = slot[2];

  eventCal.createEvent(name, startTime, endTime);
}
到:
for (x=0; x<signups.length; x++) {
  var slot = signups[x];
  var startTime = slot[0];
  var endTime = slot[1];
  var name = slot[2];
  if (name && startTime && endTime) {  // Added
    if (eventCal.getEvents(startTime, endTime).length == 0) {  // Added
      eventCal.createEvent(name, startTime, endTime);
    }
  }
}
  • name在这种情况下,startTime和的所有 3 个值endTime都存在,if 语句变为true。如果您想修改此条件,请根据您的实际情况进行修改。
  • 在上面的脚本中,即使事件标题不同而startTime相同endTime,也不会创建新事件。如果要在事件标题不同的情况下创建新事件,请if (eventCal.getEvents(startTime, endTime).length == 0) {进行如下修改。

    if (eventCal.getEvents(startTime, endTime, {search: name}).length == 0) {
    

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读