需要帮助从 Google 表格创建活动

问题描述 投票:0回答:1

我有一个脚本,可以使用 Google 表单响应 Spreadhseet 有效地创建 google 日历事件,但在我认为它完全正常运行之前,我需要进行 2 个更改。

照原样,脚本必须手动运行,但我希望它在单元格中发生更改或添加新行时触发。

照原样,脚本会复制工作表中需要停止的每个事件。创建事件时,我已将事件 ID 添加到最后一列。

现在的脚本将创建一个事件并将事件 ID 添加到最后一列。我知道这个 ID 将用于解决我的两个问题,使用某种查找函数来知道当工作表发生更改时需要更新哪个事件,并知道如果最后一行中有一个事件 ID,那么不需要创建该事件。

下面的函数确实有效,但同样,每个事件在运行时都会重复。我预计这种情况会发生,因为没有声明不创建事件的条件。我只是不知道如何正确地写出我需要它做什么。

function createcalendarevent() { 
  const sh = SpreadsheetApp.getActive();
  const cal = CalendarApp.getDefaultCalendar(); 
  const ss = sh.getActiveSheet();

  let data = ss.getRange(2,1,ss.getLastRow(),7).getValues();
  let event,loc,d1,d2,t;

  for (let i in data){
    event = data[i][3];
    loc = data [i][6];
    d1 = new Date(data[i][4]);
    t = new Date(data[i][5]);
    d1.setHours(t.getHours(),t.getMinutes());
    d2 = new Date(d1.getTime() + 60 * 60000);

    var series = cal.createEvent(event,d1,d2,{location: loc});
    var eventid = series.getId();
    SpreadsheetApp.getActiveSheet().getRange('H2').setValue(eventid);
  }
}
javascript google-apps-script google-sheets google-calendar-api
1个回答
0
投票

您有一个用于记录日历事件的 Google 表单。这与 Google 表格脚本相结合,该脚本根据表单中提交的详细信息更新 Google 日历。

您有两个未解决的问题:

  • 触发
  • 复制工作表中的每个事件。

触发

  • 该函数绑定到您的电子表格(链接到您的表单)
  • 为事件类型“表单提交”的功能
    createcalendarevent
    创建可安装的触发器。
  • 每次记录新表单提交时都会触发该功能。

仅处理一项提交 - 事件对象

  • for (let i in data){
    - 这会创建一个循环,在函数运行时处理提交。这已在答案中删除。
  • 但是如何知道最新提交的表单的详细信息呢?通过使用事件对象;阅读文档了解“表单提交”事件对象的详细信息

注意: 插入您日历的日历 ID 或修改为 getDefaultCalendar()


function createcalendarevent(e) { // list all the Event Objects // Logger.log(JSON.stringify(e)) // DEBUG const sh = SpreadsheetApp.getActive(); const sheet = sh.getSheetByName("Form Responses 1") // Gets my Stack Exchange calendar const calId = "<<Insert Calendar ID>>" const cal = CalendarApp.getCalendarById(calId); // get the row number of the submission const row = e.range.rowStart let event,loc,d1,d2,t; event = e.values[3]; loc = e.values[6]; d1 = new Date(e.values[4]); t = new Date(e.values[5]); d1.setHours(t.getHours(),t.getMinutes()); d2 = new Date(d1.getTime() + 60 * 60000); Logger.log("DEBUG: row = "+row+", event = "+event+", loc = "+loc+", d1 = "+d1+", t = "+t+", d2 = "+d2) var series = cal.createEvent(event,d1,d2,{location: loc}); var eventid = series.getId(); sheet.getRange(row,8).setValue(eventid); }

    
© www.soinside.com 2019 - 2024. All rights reserved.