Javascript 谷歌应用程序脚本创建日历条目两次
我将一个谷歌应用程序脚本混合在一起,根据我的谷歌工作表中的值在日历中创建一个事件。脚本应在以下条件下工作:Javascript 谷歌应用程序脚本创建日历条目两次,javascript,google-apps-script,google-sheets,google-calendar-api,Javascript,Google Apps Script,Google Sheets,Google Calendar Api,我将一个谷歌应用程序脚本混合在一起,根据我的谷歌工作表中的值在日历中创建一个事件。脚本应在以下条件下工作: 每当添加新行时(通过触发器实现-第一个函数) 仅适用于电子表格上的最后一行 仅当“id”单元格(28)为空时创建事件 然后,它应该创建日历事件并用事件ID填充单元格28 新行是在客户在我的网站上填写表单时创建的。我在WordPress中使用忍者表单,它有一个谷歌表单插件。因此,填写的表单将自动添加到工作表中,然后此函数将启动 一切都很顺利。当我手动测试时(例如,我删除最后一行中的id单元格
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(第28行).getValue();
var events=cal.getEvents(tstart,tstop,{search:desc})
.map(功能(e){
试一试{
返回e.getDescription();
}
抓住{
返回“”;
}
});
如果(!事件包括(描述)){
如果(id==“”){
var newEvent=cal.createEvent(标题、tstart、tstop、,
{description:desc,loc,guests:guests,sendinvests:true});
sheet.getRange(第28行).setValue(newEvent)
}
}
这样,如果脚本运行两次,那么由于第二次事件已经存在,将不会再次创建它
NB:此项检查在tstart
到tstop
的时间范围内是否存在描述为desc
的所有日历事件。如果在此时间范围内碰巧有其他具有相同描述的事件,则此脚本的行为可能不符合预期
我希望这对你有帮助
参考资料: