Google apps script 在由日期触发的Google工作表中创建日历事件

Google apps script 在由日期触发的Google工作表中创建日历事件,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我想让我的谷歌电子表格自动创建一个由日期触发的日历事件 这是我的电子表格: 这是我的工作表“健康与安全审查”: 单元格K1=今天() 列K3:K是事件列的开始日期 G3:G是事件列的结束日期 C3:C是环境名称 D3列:D是事件的描述 我想在K列中的日期等于K1中的日期时自动创建日历事件 我已创建以下calendarEvent Google Apps脚本: //发送健康与安全审查日历邀请 函数createCalendarEvent(){ var电子表格=SpreadsheetApp.g

我想让我的谷歌电子表格自动创建一个由日期触发的日历事件

这是我的电子表格:

这是我的工作表“健康与安全审查”:

  • 单元格K1=今天()
  • 列K3:K是事件列的开始日期
  • G3:G是事件列的结束日期
  • C3:C是环境名称
  • D3列:D是事件的描述
我想在K列中的日期等于K1中的日期时自动创建日历事件

我已创建以下calendarEvent Google Apps脚本:

//发送健康与安全审查日历邀请
函数createCalendarEvent(){
var电子表格=SpreadsheetApp.getActiveSpreadsheet();
var sheet=电子表格.getSheetByName(“H&S审查”).activate();
var lastRow=sheet.getLastRow();

对于(var i=3;i,我认为有几件事让你感到困惑:

CalendarApp.getCalendarById(emailAddress)
这应该是读取要修改的日历ID,而不是电子邮件地址字符串。是否要执行getCaledarsByName(emailAddress)操作如果你将日历存储为此人的电子邮件地址作为他们的姓名,那么我需要修改一下这个答案,因为按姓名获取日历会返回一个数组

从这个例子来看,您似乎只想在一个日历中创建一个日历事件。如果是这样,日历ID可以硬编码——您可以在Google Calendars中打开日历ID,单击日历旁边的点,然后“ID”就是URL的/calendar/部分之后的所有内容

var calendarDescription = CalendarApp.setDescription(description);
这应该在创建事件之后进行,因为您不想修改日历的描述或日历的整体描述,而是想修改事件的描述。这部分代码应该是:

if (todaysDate == startDate){
var calendar = CalendarApp.getCalendarById({{ID OF THE CALENDAR}});
var event =  calendar.createEvent(eventName, new Date(startDate), new Date(endDate));
event.setDescription(description);
我还包括了创建calendar变量的调用,以及在比较日期字符串后调用CalendarApp的调用,以便它不会不必要地执行此操作。您不需要分配事件描述变量,因为.setDescription的返回是日历事件本身,不需要对返回执行任何操作。如果您想进一步缩短,您甚至可以将其链接:

var event = calendar.createEvent(eventName, new Date(startDate), new Date(endDate)).setDescription(description);

接下来,要创建的事件有一个在结束日期之前的多天的开始日期。您可能想考虑这里的意图。

如果您想创建一个短事件来提醒您在一天中的某个时间做某事,那么您确实应该确保您只需添加一个开始时间,然后创建一个新的日期变量,该变量在开始时间中添加一定的时间量,以将“endDate”分配给事件。例如,列表第一行中的“Send date”您的示例表为“2019年11月26日”,“审核”日期为“2019年12月10日”,分别对应于您的“开始日期”和“结束日期”变量

根据任务名称,创建全天活动是否更符合您的需要:

var event = calendar.createAllDayEvent(title, date);
最后,请注意不要频繁使用日期。在比较日期时要非常小心格式,以确保所有内容都处于相同的格式和时区。如果继续测试其中一个是否为==到另一个,那么如果在运行脚本时错过了一天,则可能会因此错过添加事件

希望这有帮助

编辑:我点击post,注意到有几个地方,我认为在引用脚本中单元格中的范围时,1被意外地用来代替变量“I”。例如:

var description = sheet.getRange(1, 4).getValue();
应该是:

var description = sheet.getRange(i,4).getValue();

如果
var emailAddress=sheet.getRange(i,18).getValue()的
emailAddress
不是
CalendarApp.getCalendarById()的有效日历ID
,这样的错误会发生。那么再次确认值如何?谢谢-我太傻了。我这次运行的脚本没有错误,但它没有创建事件。您看到我的代码有任何错误吗?谢谢您的回复。在您更新的脚本中,
todaysDate
startDate
从单元格“K1”中检索。当单元格“K1”的值是日期对象时,会比较日期对象。这样,结果总是
false
。那么如何将
if(todaysDate==startDate){
修改为
if(todaysDate.getTime()==startDate.getTime()){
?或者如何修改
sheet.getRange(1,11).getValue()
sheet.getRange(1,11).getDisplayValue()
?但我不确定您的实际情况。因此,如果这不是直接的解决方案,我道歉。谢谢您-您的第一个建议错误为“事件开始时间必须在事件结束时间之前”但是K列中的日期都比G列早14天。您的第二个建议没有错误,但没有创建日历event@McChief您能检查(通过调试或记录器)您通过的开始和结束时间吗?感谢您的详细回答。在“H&S回顾”中的每个事件工作表将分配给另一个人。我已创建了由K列中的日期触发的电子邮件,在G列中给出了14天的到期通知。我想为每个负责审核的人创建一个日历事件,是的,这可能是一个在事件到期前7天的一天事件。我已添加了日历URL并更新了代码正如你所建议的(我认为)。我已经更改了我的问题和我链接的应用程序脚本中的代码。目前在第17行出现错误。非常感谢您对代码的帮助。当您转到以下位置时,日历ID是浏览器URL栏中的字母数字字符串:转到calendar.google.com->单击有问题的日历->日历设置。日历的“ID”位于浏览器的URL栏中,在上面的注释中类似于此。这是最后一部分(CM4IRG9RBGRIB21BC2VSBGYLAV)