Google apps script 从谷歌工作表到日历的时区差异
我有一段代码,从电子表格单元格中读取任务名称和日期,并在该日期用任务名称安排一个全天日历事件Google apps script 从谷歌工作表到日历的时区差异,google-apps-script,google-sheets,google-api,google-calendar-api,google-api-js-client,Google Apps Script,Google Sheets,Google Api,Google Calendar Api,Google Api Js Client,我有一段代码,从电子表格单元格中读取任务名称和日期,并在该日期用任务名称安排一个全天日历事件 /** @OnlyCurrentDoc */ function AddToCalendar1(){ var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process - 2 exempts my header row var numRows = sheet.
/** @OnlyCurrentDoc */
function AddToCalendar1(){
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // First row of data to process - 2 exempts my header row
var numRows = sheet.getLastRow(); // Number of rows to process
var numColumns = sheet.getLastColumn();
var dataRange = sheet.getRange(startRow, 1, numRows-1, numColumns);
var data = dataRange.getValues();
var complete = "Yes";
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var eventDate = row[0]; //date to schedule
var task = row[1]; //job description
var status = row[2] // Scheduled?
if (status != complete) {
var currentCell = sheet.getRange(startRow + i, 3);
var c =CalendarApp.getDefaultCalendar();
var event = c.createAllDayEvent(task, new Date(eventDate));
Logger.log('Event ID: ' + event.getId());
currentCell.setValue(complete);
}
}
}
Edit2
这是运行测试功能的结果
[19-09-10 13:44:06:319 ART] Sheet time zone: America/Los_Angeles
[19-09-10 13:44:06:320 ART] Script time zone: America/New_York
[19-09-10 13:44:06:414 ART] Date from sheet: Thu Oct 10 2019 03:00:00 GMT-0400 (EDT)
另外,我不确定现在有什么变化我在这行有一个错误
var event = CalendarApp.getDefaultCalendar().createAllDayEvent(task, new Date(eventDate.getTime()+3600000*10));
我建议仔细检查工作表和脚本的时区设置 我看到了你描述的当两者之间时区不匹配时的行为 我在单元格A1中设置了一个值为
2019-09-09
的表。然后,我使用以下函数设置容器绑定脚本:
function testTimeZones() {
Logger.log('Sheet time zone: ' + SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone());
Logger.log('Script time zone: ' + Session.getScriptTimeZone());
Logger.log('Date from sheet: ' + SpreadsheetApp.getActiveSheet().getRange(1, 1).getValue());
}
[19-09-09 22:28:26:039 PDT] Sheet time zone: America/Buenos_Aires
[19-09-09 22:28:26:041 PDT] Script time zone: America/Argentina/Buenos_Aires
[19-09-09 22:28:26:127 PDT] Date from sheet: Mon Sep 09 2019 00:00:00 GMT-0300 (ART)
当工作表和脚本的时区都设置为(GMT-03:00)布宜诺斯艾利斯
,这是执行该功能后的日志输出:
function testTimeZones() {
Logger.log('Sheet time zone: ' + SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone());
Logger.log('Script time zone: ' + Session.getScriptTimeZone());
Logger.log('Date from sheet: ' + SpreadsheetApp.getActiveSheet().getRange(1, 1).getValue());
}
[19-09-09 22:28:26:039 PDT] Sheet time zone: America/Buenos_Aires
[19-09-09 22:28:26:041 PDT] Script time zone: America/Argentina/Buenos_Aires
[19-09-09 22:28:26:127 PDT] Date from sheet: Mon Sep 09 2019 00:00:00 GMT-0300 (ART)
但是,当我将脚本时区切换到东部时间(GMT-05:00)时,这是日志输出:
[19-09-09 22:37:34:116 PDT] Sheet time zone: America/Buenos_Aires
[19-09-09 22:37:34:118 PDT] Script time zone: America/New_York
[19-09-09 22:37:34:207 PDT] Date from sheet: Sun Sep 08 2019 23:00:00 GMT-0400 (EDT)
与你看到的行为相符
尝试两件事:
通过在脚本编辑器中检查文件
->项目属性
,验证脚本时区
如果1不起作用,作为一个健全性检查,请尝试在项目中执行上面的测试函数。将其更改为指向具有日期值的单元格,或通过在单元格A1中创建具有日期的临时工作表来按原样使用它。考虑用结果更新问题,以提供更多的上下文。
谢谢,关于“通过在脚本编辑器中检查文件->项目属性来验证脚本时区”的一条评论。它是一个只读属性,设置为GMT-5。这有助于非常具体,因为并非所有时区的行为都相同。例如,(GMT-05:00)东部时间因日期对象输出中的(EDT)
(东部夏时制)而根据一年中的时间而变化。关于脚本时区属性,您是脚本所有者吗?在我创建的示例脚本中,我可以更改属性。Zona horaria(GMT-05:00)Hora del Este
,并查看最后一次编辑,其中包含测试函数的结果,其中涉及找不到函数…
错误。。。如果您创建了一个新的工作表来运行测试功能,那么您就有了一个新的“活动”工作表,该工作表在代码所期望的位置不包含数据。因此,不会检索单元格值,不会实例化日期对象,等等。在您的问题中,您指出,“日历和电子表格具有相同的时区配置,即GMT-3”。不幸的是,这不是事实,这是您遇到的问题的根本原因。