如何基于表单提交创建事件?

How to createEvent based on form submits?

我在主要编码支持论坛上多次看到一个问题,如何根据表单提交将事件添加到日历。尽管如此,我还是很挣扎。

时间戳形式 日期 名字 开始时间 结束时间 描述
25/05/2021 13:05:05 =to_date(A2) 开会 15:05:00 15:42:00 花园
26/05/2021 14:58:55 =to_date(A3) 奇姆 09:05:00 11:45:00 烟囱

活动总是在表单提交之日举行。下面的代码巧妙地从第一次提交开始就创建了一个事件,但我无法让它继续进行。

var spreadsheet   = SpreadsheetApp.getActive().getSheetByName("sheet1");
var data          = spreadsheet.getRange("A2:F").getDisplayValues();

function toCale() {
  start     = new Date(data[0][1] + " " + data[0][3]);
  end       = new Date(data[0][1] + " " + data[0][4]);
  var calen = CalendarApp.getCalendarById("example@group.calendar.google.com");
  calen.createEvent(data[0][2], start, end,
    {location: "Arc du Triomphe", description: data[0][5]});
}

事件只需要基于上次提交,所以我可以将其放在“表单提交”触发器上。

如有任何帮助,我们将不胜感激。

解法:

您的代码被硬编码为从第 2 行获取事件信息,如 getRange("A2:F") 所定义。由于您使用的是 onFormSubmit 触发器,因此您需要取最后一行,它对应于最新的提交。

示例代码:

var spreadsheet   = SpreadsheetApp.getActive().getSheetByName("sheet1");
var lr            = spreadsheet.getLastRow();
var data          = spreadsheet.getRange(lr,1,1,6).getDisplayValues();

function toCale() {
  start     = new Date(data[0][1] + " " + data[0][3]);
  end       = new Date(data[0][1] + " " + data[0][4]);
  var calen = CalendarApp.getCalendarById("example@group.calendar.google.com");
  calen.createEvent(data[0][2], start, end,
    {location: "Arc du Triomphe", description: data[0][5]});
}

参考:

Class Sheet

我在表单中添加了位置,但我没有将它们写入 sheet,因为它们已经在链接 sheet 中,但将其添加到 sheet 所以我会把那个留给你去做。

function createEventsOnFormSubmit(e) {
  Logger.log(JSON.stringify(e));
  if (e.range.getSheet().getName() == "Linked Sheet Name") {
    const ss = SpreadsheetApp.getActive();
    const sh = ss.getSheetByName("Events");
    const cal = CalendarApp.getCalendarById('calendar id');
    let t = e.values[1].split('/')
    let y = Number(t[2]);
    let m = Number(t[0] - 1);
    let d = Number(t[1]);
    let st = e.values[3].split(/:| /);
    let shr;
    if (st[3] == "PM" && Number(st[0]) < 12) {
      shr = Number(st[0]) + 12;
    } else {
      shr = Number(st[0]);
    }
    let smin = Number(st[1]);
    let ssec = Number(st[2]);
    let startTime = new Date(y, m, d, shr, smin, ssec);
    let et = e.values[4].split(/:| /);
    let ehr;
    if (et[3] == "PM" && Number(et[0]) < 12) {
      ehr = Number(et[0]) + 12
    } else {
      ehr = Number(et[0]);
    }
    let emin = Number(et[1]);
    let esec = Number(et[2]);
    let endTime = new Date(y, m, d, ehr, emin, esec);
    cal.createEvent(e.values[2], startTime, endTime, { description: e.values[5], location: e.values[6] })
  }
}

我的链接Sheet:

Timestamp Date Name StartTime endTime Description Location
7/28/2021 13:53:17 7/29/2021 Redacted 12:00:00 PM 1:00:00 PM Redacted Redacted
7/28/2021 14:06:08 7/28/2021 Redacted 12:00:00 PM 1:00:00 PM Redacted Redacted
7/28/2021 14:10:25 7/28/2021 Redacted 12:00:00 PM 1:00:00 PM Redacted Redacted
7/28/2021 15:32:35 7/29/2021 Redacted 12:00:00 PM 1:00:00 PM Redacted Redacted

您可以使用此函数来 运行 函数而无需使用表单提交:

function testnextfunction() {
  const e = JSON.parse('{"authMode":"FULL","namedValues":{"Timestamp":["7/28/2021 14:10:25"],"StartTime":["12:00:00 PM"],"Description":["Description"],"Date":["7/28/2021"],"endTime":["1:00:00 PM"],"":[""],"Location":["Location"],"Name":["Labs"]},"range":{"columnEnd":7,"columnStart":1,"rowEnd":4,"rowStart":4},"source":{},"triggerUid":"","values":["7/28/2021 14:10:25","7/28/2021","Labs","12:00:00 PM","1:00:00 PM","Description","Location",""]}');
  e.range = SpreadsheetApp.getActive().getSheetByName('Linked Sheet Name').getRange('A1');//any range in the sheet will suffice
  createEventsOnFormSubmit(e);//called the onFormSubmit function and supply event object
}

我的表格: