我有一个脚本,可以使用 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);
}
}
您有一个用于记录日历事件的 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);
}