google-apps-script - 从谷歌表到日历的时区差异
问题描述
我有这段代码从电子表格单元格中读取任务名称和日期,并在该日期安排一个带有任务名称的全天日历事件。
/** @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);
}
}
}
问题是现在是格林威治标准时间 3 点晚上 11:10,现在(不确定是否重要) 单元格具有值,'2019-09-09'
但'eventDate'
'Sun Sep 08 2019 23:00:00 GMT-0400 (EDT)'
所以任务安排在前一天。
我怎样才能改变这个?
日历和电子表格具有相同的时区配置,即 GMT-3
应该/我可以更改脚本正在执行的时区吗?
编辑 我刚刚发现添加几个小时我可以完成这项工作,但它看起来不像是正确的解决方案
var event = c.createAllDayEvent(task, new Date(eventDate.getTime()+3600000*10));
编辑2
这是运行测试功能的结果
[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));
Cannot find function getTime in object .
解决方案
我建议仔细检查为工作表和脚本设置的时区。
当两者之间存在时区不匹配时,我看到了您所描述的行为。
我设置了一张2019-09-09
在单元格 A1 中具有值的工作表。然后我使用以下函数设置了一个容器绑定脚本:
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());
}
当工作表和脚本的时区都设置为 时(GMT-03:00) Buenos Aires
,这是执行该函数后的日志输出:
[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) Eastern Time
,这是日志输出:
[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)
这与您看到的行为相匹配。
有两件事要尝试:
- 通过在脚本编辑器中选中
File
->来验证脚本时区。Project Properties
- 如果 1 不起作用,作为健全性检查,请尝试在您的项目中执行上面的测试功能。要么将其更改为指向具有日期值的单元格,要么通过在单元格 A1 中创建带有日期的临时工作表来按原样使用它。考虑使用结果更新问题以提供更多上下文。
推荐阅读
- css - Blazor + Bootstrap + SCSS 中的 CSS 隔离:可以吗?(::深度选择器)
- python - 如何将一维 numpy 数组拆分为块,每个块的长度取决于条件
- sql - 结构和数组 - 错误:标量子查询产生了多个元素
- c# - 如何在 Windows 10 中打开“输入网络凭据”
- javascript - moment 和 moment.utc 有什么区别
- fastlane - Fastlane 以错误结束 - 匹配 - 没有错误消息
- python - 我在检查字符串变量是否仅包含数字时遇到问题,例如 string = "1234" ---> 意味着我希望它为真
- c++ - 如何使用 nlohmann json 从字符串中获取值类型?
- java - 如何使用迭代器(Java)替换 List 中的值
- c - 我的贪心算法有问题吗