我是一个新手,正在使用别人的旧 Google 应用程序脚本,该脚本将从 Google 表单收集的事件信息添加到事件日历中。 一切都很好,只是时间缩短了一个小时。例子:
用户输入:
活动开始:4/10/2023 7:30:00
活动结束:4/10/2023 9:15:00
日历节目:
周一,4 月 10 日⋅8:30 – 10:15am
这是脚本。
最开始有一个 DST 偏移量。
底部有个获取时区偏移量的函数。(不过好像注释掉了。)
我的用户知道他们的活动将在什么时间举行。我们不需要任何补偿。表格回复中出现的内容应该出现在日历中。
请告诉我我需要做什么来解决这个问题。
const DST_HOURS = -0;
function onFormSubmit(e) {
const TARGET_CAL_ID = 'kinnschools.org_bunn4o6u6do0uvgmfiqo3ifp2o@group.calendar.google.com';
// Fields: 0 = Timestamp, 1 = Email Address, 2 = Event Title:, 3 = Event Start:, 4 = Event End:,
// 5 = Building:, 6 = Room:, 7 = Presenter Contact Info :, 8 = Computer Services:,
// 9 = Custodial Services:, 10 = Food Services:, 11 = Additional Info:
var title = e.values[5] + '-' + e.values[6] + ' ' + e.values[2] + ' (evnt1)';
var description = '';
var descObj = {
'Event Submitted by': 1,
'Presenter Contact Info': 7,
'Computer Services': 8,
'Custodial Services': 9,
'Food Services': 10,
'Additional Info': 11
};
for (var f in descObj) {
description += f + ':\n' + e.values[descObj[f]] + '\n\n';
}
var startTime = new Date(e.values[3]).addHours(),
endTime = new Date(e.values[4]).addHours();
var event = CalendarApp.getCalendarById(TARGET_CAL_ID).createEvent(title, startTime, endTime, {
description: description
});
}
function testFormInput(e) {
var sheet = SpreadsheetApp.getActive().getSheets()[0];
var d = sheet.getRange(sheet.getLastRow(), 4).getValue();
var values = ['_' + e.values[3], e.values[3], new Date(e.values[3]), d];
sheet = SpreadsheetApp.getActive().getSheets()[1];
sheet.appendRow(values);
}
Date.prototype.addHours = function() {
this.setHours(this.getHours() + DST_HOURS);
return this;
}
/*
function getTimeZoneOffsets() {
var d = new Date();
var n = d.getTimezoneOffset();
var sheet = SpreadsheetApp.getActive().getSheets()[1];
//var s = '10/7/2019 12:50:00 -0500';
var zones = sheet.getRange('B2:E2').getValues()[0].map(function(d) {
return d.getTimezoneOffset();
});
Logger.log(zones);
}
*/
事件处理涉及四个可能不同的时区。
4/10/2023 7:30:00
这样的日期字符串的用户生活在一个时区,但是在任何地方都没有提到这一点,使日期字符串变得模棱两可。new Date("4/10/2023 7:30:00")
在 Google Apps script的时区创建一个
Date
对象(参见“项目设置 > 常规设置 > 时区”)。如果这与#1 的时区不同,则结果只能是错误的。以下代码段显示了如何使用#1 时区在浏览器 中解析日期,从而使日期字符串变得明确。Ambiguous date string:
<input name="datetime" type="datetime-local"
onchange="this.nextElementSibling.textContent=new Date(this.value).toISOString()"/>
Unambiguous date string:
<div></div>
createEvent
以Date
对象作为开始和结束,没有歧义。当以 iCal 格式导出 Google 日历时,事件显示在 Google calendar 的时区中(请参阅“日历设置 > 时区”)。检查您案例中从#2 到#4 的三个时区,以及它们是否与您在#1 中假设的时区一致。如果这不能解释您观察到的内容,请编辑您的问题并命名这些时区。
(将
DST_HOURS
添加到 Date
对象不是一个干净的解决方案,特别是考虑到夏令时偏移量在一年中变化。)