如何基于表单提交创建事件?
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]});
}
参考:
我在表单中添加了位置,但我没有将它们写入 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
}
我的表格:
我在主要编码支持论坛上多次看到一个问题,如何根据表单提交将事件添加到日历。尽管如此,我还是很挣扎。
时间戳形式 | 日期 | 名字 | 开始时间 | 结束时间 | 描述 |
---|---|---|---|---|---|
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]});
}
参考:
我在表单中添加了位置,但我没有将它们写入 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
}
我的表格: