首页 > 解决方案 > 从谷歌表到日历的时区差异

问题描述

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

/** @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 .

标签: google-apps-scriptgoogle-sheetsgoogle-apigoogle-calendar-apigoogle-api-js-client

解决方案


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

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

我设置了一张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)

这与您看到的行为相匹配。

有两件事要尝试:

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

推荐阅读