【问题标题】:time zone difference from google sheet to calendar从谷歌表到日历的时区差异
【发布时间】:2020-01-11 18:18:27
【问题描述】:

我有这段代码从电子表格单元格中读取任务名称和日期,并在该日期安排一个带有任务名称的全天日历事件。

/** @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);
    }

  }

}

问题现在是 GMT-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 .

【问题讨论】:

    标签: google-apps-script google-sheets google-api google-calendar-api google-api-js-client


    【解决方案1】:

    我建议仔细检查为工作表和脚本设置的时区。

    当两者之间的时区不匹配时,我看到了您所描述的行为。

    我在单元格 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());
    }
    

    当工作表和脚本的时区都设置​​为(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)
    

    这与您看到的行为相符。

    尝试两件事:

    1. 通过在脚本编辑器中检查 File -> Project Properties 来验证脚本时区。
    2. 如果 1 不起作用,作为健全性检查,请尝试在您的项目中执行上述测试功能。要么将其更改为指向具有日期值的单元格,要么通过在单元格 A1 中创建带有日期的临时工作表来按原样使用它。考虑使用结果更新问题以提供更多背景信息。

    【讨论】:

    • 谢谢,关于“通过检查文件 -> 脚本编辑器中的项目属性来验证脚本时区”的评论。它是一个设置为 GMT -5 的只读属性。
    • 非常具体会有所帮助,因为并非所有时区的行为都相同。例如,(GMT-05:00) Eastern Time 由于daylight savings time 而根据一年中的时间变化,因此日期对象输出中的(EDT)(东部夏令时间)。关于脚本时区属性,您是脚本所有者吗?在我创建的示例脚本中,我可以更改属性。
    • Zona horaria (GMT-05:00) Hora del Este 并使用测试函数的结果查看上次编辑
    • 关于Cannot find function... 错误...如果您创建了一个新工作表来运行测试功能,您将拥有一个新的“活动”工作表,其中不包含代码预期位置的数据。因此没有检索到单元格值,没有实例化日期对象等。
    • 在您的问题中,您说:“日历和电子表格具有相同的时区配置,即 GMT-3”。不幸的是,这不是真的,这是您遇到问题的根本原因。
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2020-11-04
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多