簡體   English   中英

Google表格中的日期/時間未將正確的時間轉移到Google日歷中

[英]Date/Time in Google Sheet not transferring the correct time into Google calendar

我有這個腳本是要用事件填充Google日歷。 我有一個日期字段以及一個開始和結束時間字段。 在Google電子表格中,當我運行以下腳本時,開始時間是13:00:00,結果日歷開始時間是14:00:00。 結束時間也會發生同樣的事情。

    function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export Events",
    functionName : "exportEvents"
  }];
  sheet.addMenu("Calendar Actions", entries);
};

/**
 * Export events from spreadsheet to calendar
 */
function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 1;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "trade.nsw.gov.au_004rslcuubrtlg81mkv48lse9c@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (i in data) {
    if (i < headerRows) continue; // Skip header row(s)
    var row = data[i];
    var date = new Date(row[2]);  // First column
    var title = row[1];           // Second column
    var tstart = new Date(row[3]);
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[4]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var loc = row[5];
    var desc = row[6];
    var id = row[10];              // Sixth column == eventId
    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventSeriesById(id);
    }
    catch (e) {
      // do nothing - we just want to avoid the exception when event doesn't exist
    }
    if (!event) {
      //cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
      row[10] = newEvent;  // Update the data array with event ID
    }
    else {
      event.setTitle(title);
      event.setDescription(desc);
      event.setLocation(loc);
      // event.setTime(tstart, tstop); // cannot setTime on eventSeries.
      // ... but we CAN set recurrence!
      //var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
      //event.setRecurrence(recurrence, tstart, tstop);
    }
    debugger;
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
}

問題很簡單,但解釋卻不那么簡單...

讓我們無論如何嘗試!

代碼修改:

var tstart = new Date(row[3]);
Logger.log('hour only = '+tstart)
tstart.setDate(date.getDate());
Logger.log('setDate = '+tstart)
tstart.setMonth(date.getMonth());
Logger.log('setMonth = '+tstart)
tstart.setYear(date.getYear());
Logger.log('setYear = '+tstart)

如您所見,我在代碼中添加了兩個Logger.log ,並注意到時間值有所不同,如下所示

[14-07-28 16:18:53:441 BST] hour only = Sat Dec 30 1899 10:00:00 GMT-0000 (GMT)
[14-07-28 16:18:53:442 BST] setDate = Fri Dec 29 1899 10:00:00 GMT-0000 (GMT)
[14-07-28 16:18:53:442 BST] setMonth = Sat Jul 29 1899 10:00:00 GMT+0100 (BST)
[14-07-28 16:18:53:442 BST] setYear = Tue Jul 29 2014 10:00:00 GMT+0100 (BST)

當您僅使用小時創建日期對象時,該日期邏輯上是冬季的1899年12月30日。(1899年12月30日是JS日期中用作參考的“紀元”)

然后,您設置日期(仍然是12月),然后是7月和7月,顯然是夏天。正如您在記錄器中看到的那樣,日期對象已從GMT切換為BST(我想是英國的夏令時? ),然后從那里開始1小時。

為了解決您的問題,最簡單的方法是在電子表格本身中結合時間和日期,這將創建一個不需要任何更改的完整日期對象。

如果您不能(或不想)更改SS布局,我想更簡單的方法是使用Utilities.formatDate()將您的時間值轉換為字符串並將該字符串解析為整數值以獲得小時和分鍾。

您必須稍微更改日期操作的順序,但是從我對您的編碼技巧的看法來看,這應該不成問題。

希望我的解釋很清楚;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM