S.O.S.试图创建一个事件在谷歌日历通过谷歌(表+脚本),但失败.我想这和时间有关

S.O.S. Trying to create an event in google calendar via google (sheets + script), but failing. I think it has to do with the time?

本文关键字:谷歌 脚本 失败 时间 创建 一个 日历 事件      更新时间:2023-09-26

所以我的剧本是基于互联网上很多很棒的人的剧本。然而,他们的脚本创建了全天事件,我只想创建一个小时的事件,所以我调整了它(不成功)。

这是我的脚本

    /**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the exportEvents() function.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
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 = 2;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "shmoop.com_6bibh4i9sg0jp5qicbsl1n31ik@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (i=0; i<data.length; i++) {
    if (i < headerRows) continue; // Skip header row(s)
    var row = data[i];
    var date = new Date(row[0]);  // First column
    var project = row[1]+row[3]+row[4];           // Second column
    var dueDate = new Date(row[6])
    var tstart = new Date(dueDate.setTime(17,00,00,00));
    var tstop = new Date(dueDate.setTime(18,00,00,00));
    var id = row[15];              // Sixth column == eventId
      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(project, tstart, tstop).getId();
      row[15] = newEvent;  // Update the data array with event ID
    }    else {
      event.setTitle(project);
      // 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);
}
} 

我知道脚本运行,因为每次我运行exportEvents()时,google电子表格都会更新一个事件ID。但我怀疑,由于tsart, tstop变量,实际上没有事件被推送到日历中。哦,还有,这里有一个电子表格中包含相关列的行示例:

7/10/2015 10:09:00 | Marty | wyrlwynd@mail.com |新代数II |第11单元填空| 380 | 7/17/2015 |进行中| | xavier@mail.com

欢迎任何帮助

你需要修改setTime

var tstart = new Date(dueDate.setTime(17,00,00,00));
var tstop = new Date(dueDate.setTime(18,00,00,00));

到一个setHours

var tstart = new Date(dueDate.setHours(17,00,00,00))
var tstop =  new Date(dueDate.setHours(18,00,00,00))

setTime的描述:

将日期设置为1970年1月1日之后/之前的指定毫秒数

的例子:

将1332403882588毫秒添加到1970年1月1日,并显示新的日期和时间:

var d = new Date();
d.setTime(1332403882588);

d的结果将是:

Thu Mar 22 2012 04:11:22 GMT-0400 (Eastern Standard Time) 

setHours:

设置日期对象的小时

例子

设置小时为15:

var d = new Date();
d.setHours(15);

d的结果将是:

Thu Jul 16 2015 15:53:22 GMT-0400 (Eastern Standard Time) 

来源:http://www.w3schools.com/jsref/jsref_obj_date.asp

setTime()方法实际上接受毫秒作为参数。

您可以查看此页以供参考。

那么,对于这个事件,你必须这样做:

var tstart = new Date(dueDate.setTime(1437395333000));

所以事件开始日期的值将是:

Mon Jul 20 05:28:53 GMT-07:00 2015

setTime()方法设置1970年1月1日起的时间。您可以计算毫秒数并在方法中传递该值。我参考了这个页面来计算毫秒数。

在您的代码中进行上述更改后,我能够创建一个事件。

希望有帮助!