繁体   English   中英

Google Apps 脚本两次创建日历条目

[英]Google Apps Script is creating calendar entry twice

我已经将 Google Apps 脚本混合在一起,以根据我的 Google 表格中的值在日历中创建一个事件。 该脚本应在以下条件下工作:

  1. 每当添加新行时(由触发器实现 - 第一个函数)
  2. 仅适用于电子表格的最后一行
  3. 仅当“id”单元格 (28) 为空时才创建事件

然后它应该创建日历事件并用事件 ID 填充单元格 28。

当客户在我的网站上填写表格时,会创建新行。 我在带有 Google Sheets 插件的 WordPress 中使用 Ninja Forms。 所以填写的表格会自动添加到工作表中,然后这个函数会被触发。

一切都差不多了 当我手动测试时(例如,我删除最后一行中的 id 单元格,或者创建一个新行或复制一个现有行),它完美地工作。 当单元格 28 中已经没有事件 ID 时才会创建事件,并且它成功地用 ID 填充了单元格 28。 伟大的!

但是,当使用 WordPress 表单创建行时,我会收到两个日历事件。 IE - 就像函数运行了两次。 每个事件都是相同的,并且都是同时创建的。

我猜这与表单与工作表的集成方式有关。 它以某种方式触发了我的功能两次。 我曾尝试在函数的不同点使用 Utilities.sleep 使用不同的值,看看在 strps 之间等待是否有帮助,但无济于事。

任何人都可以想出一种方法可以阻止这种情况发生吗? 是否有某种检查可以内置到我的函数中? 还是我错过了一些明显的东西? 我真的很感激任何建议。 这是我的代码:

function initializeTrigger(){ // run once only to create the trigger
  var sheet = SpreadsheetApp.getActive();
 ScriptApp.newTrigger("NewCalEvent")
   .forSpreadsheet(sheet)
   .onChange()
   .create();
}

function NewCalEvent() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Bookings2');
  var row = sheet.getLastRow();
  var calId = "xxxyyy@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  var date = sheet.getRange(row, 1).getValue();
  var title = sheet.getRange(row, 26).getValue();
  var tz = sheet.getRange(row, 23).getValue();
  var tstart = new Date(sheet.getRange(row, 32).getValue());
  var tstop = new Date(sheet.getRange(row, 33).getValue());
  var loc = sheet.getRange(row, 2).getValue();
  var desc = sheet.getRange(row, 27).getValue();
  var guests = sheet.getRange(row, 29).getValue();
  var id = sheet.getRange(row, 28).getValue();
if (id == ""){    
  var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc,guests:guests,sendInvites:true}).getId();
  sheet.getRange(row, 28).setValue(newEvent)
  }
}

可能的解决方案:

添加检查以查看是否已为此创建日历事件。

更多信息:

由于不清楚此触发器重复的确切来源,因此避免创建两次事件的方法是在日历中搜索具有您打算输入的描述的事件的指定时间范围,然后包装事件创建检查中的代码,因此它仅在事件尚不存在时运行。

代码片段:

// ...
var id = sheet.getRange(row, 28).getValue();
var events = cal.getEvents(tstart, tstop, {search: desc})
      .map(function(e) {
        try {
          return e.getDescription();
        }
        catch {
          return "";
        }
      });

if (!events.includes(desc)) {
  if (id == ""){
    var newEvent = cal.createEvent(title, tstart, tstop,
      {description:desc,location:loc,guests:guests,sendInvites:true}).getId();
    sheet.getRange(row, 28).setValue(newEvent)
  }
}

这样,如果脚本运行了两次,那么由于第二次事件已经存在,就不会再创建它。

NB:该检查所有日历活动的时间帧中存在tstarttstop具有的描述desc 如果您在此时间范围内碰巧有其他具有相同描述的事件,则此脚本可能不会按预期运行。

我希望这对你有帮助!

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM