首页 > 解决方案 > 使用 AppScript 连接 Google 日历和 Google 表格时出现重复事件的问题

问题描述

我成功地将 GCalendar 集成到 Gsheet 以创建事件。提交 Google 表单后,应用脚本会向我的日历和访客日历发送邀请。

我在自动化和重复条目方面遇到问题。当出现新行时脚本不会运行 - 在编辑和表单提交时都尝试过 - 当我强制它运行时,它会重新安排所有过去的事件。

这是我的代码

function CreateEvent() {

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('functionSheet');
  var eventCal = CalendarApp.getCalendarById('name@email.com');
  var lr = spreadsheet.getLastRow();
  var count = spreadsheet.getRange("A2:N"+lr+"").getValues();

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

      var shift = count[x];

      var summary = shift[2];
      var startTime = shift[7];
      var endTime = shift[8];
      var guests = shift[1];
      var description = shift[3];
      var location = shift[5];   
      var event = {
          'location': location,
          'description': description,
          'guests':guests +',',
          'sendInvites': 'True',
      }

      eventCal.createEvent(summary, startTime, endTime, event)
  }


}

我正在寻找一种解决方案来改进我的脚本,以便它在每次完成新提交时运行,并且不要根据旧条目(前几行)发送邀请。

标签: google-apps-scriptgoogle-sheetsgoogle-forms

解决方案


您正在根据来自 Google 表单的表单响应创建日历事件。当您的代码运行时,它会为所有响应创建事件,而不仅限于最近的响应。

解决此问题的措施有两个:

  1. 通过使用可安装的触发器`onFormSubmit 来触发函数。
  2. 使用事件对象来捕获表单响应值,并根据这些值更新日历。

注意:您的函数现在称为CreateEvent(e). 该e属性将自动让您访问事件对象。

以下代码未经测试,但它指示了要采取的方法。

`


function CreateEvent(e) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // Logger.log(JSON.stringify(e)); // DEBUG

  // identify Calendar
  var eventCal = CalendarApp.getCalendarById('<insert id >');

  // get the response data
  var summary = e.values[2];
  var startTime = e.values[7];
  var endTime = e.values[8];
  var guests = e.values[1];
  var description = e.values[3];
  var location = e.values[5];   
  var event = {
    'location': location,
    'description': description,
    'guests':guests +',',
    'sendInvites': 'True',
  }

  // create the event.
  eventCal.createEvent(summary, startTime, endTime, event)


}

onForm提交

使用可安装的触发器触发函数很重要onFormSubmit请参阅手动管理触发器的文档以获取按步骤设置的“操作方法”说明。

完成设置后,您的屏幕应如下所示。

请注意,函数名称 ( CreateEvent) 并不表示您正在使用事件对象 - 这没关系 - 触发器只是获取基本名称。但是,实际调用您的函数CreateEvent(e)以便它可以访问事件对象非常重要。


在此处输入图像描述


推荐阅读