【问题标题】:Creating recurring Google Calendar events from Google Sheet从 Google 表格创建重复的 Google 日历活动
【发布时间】:2014-09-17 16:03:49
【问题描述】:

我正在尝试从 Google 电子表格中设置年度重复事件,尽管我已关注 this answer,但我仍然无法获取写入每一行的 ID,因此我无法写入和检查条目.

列布局是

RenDate | Domain | Client | Type | Registrar | ID

代码:

/**
 * 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 = 1;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "[id removed]@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[0]);  // First column - Renewal Date
    var domain = row[1];          // Second column - Domain
    var client = row[2];          // Third column - Client
    var type = row[3];            // Fourth column - Type
    var source = row[4];          // Fifth column - Registrar
    var id = row[5];              // Sixth column - ID
    if(row[1]=="") continue;      // Skip rows if no date exists
    var title = type + " renewal for " + domain;
    var desc = "Renew with " + source + " for " + client;

    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventSeriesById(id);
      event.setTitle('got you');  // this is to "force error" if the event does not exist
    }catch (e) {
      var newEvent = cal.createEvent(title, date, {description:desc});
      row[5] = newEvent.getId();   // Update the data array with event ID
      Logger.log('event created'); // For debugging
      var event = cal.getEventSeriesById(row[5]);
    }
    event.setTitle(title);
    event.setDescription(desc);
    var recurrence = CalendarApp.newRecurrence().addYearlyRule();
    event.setRecurrence(recurrence, date);
    debugger;
    data[i] = row ;
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
}

调试似乎没问题,但没有创建任何事件。我能够使用CreateAllDayEventSeries 函数创建事件,但这似乎无法使用 ID 方法解决,因此我尝试使用此方法。

编辑:进行了更改以继续被 Serge insas 捕获的功能。

现在脚本在catch 命令上找不到createEvent 的方法。

【问题讨论】:

  • 为什么要写 if (row[1]) continue?这打破了循环,代码除了继续之外什么都不做......
  • 这只是一种检查该单元格是否为空的方法;它适用于早期的迭代。我仍然希望该检查能够正常工作,尽管如果这是其余代码完成的问题,这是一种更好的方法。
  • 那么应该是 if(row[1]=="")... 跳过空行
  • 还是不行?您可以尝试在循环内添加Logger.log(row[i] 以查看确切的行内容吗?
  • catch createEvent 方法失败,日志只显示第一行。

标签: google-apps-script google-calendar-api google-spreadsheet-api


【解决方案1】:

我发现您犯了一些错误(最小),导致它无法正常工作。

一个细节:您尝试使用单个日期创建事件,这仅适用于 allDay 事件,所以我想这就是您想要做的。

下面是完整的工作代码:

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 range = sheet.getDataRange();
  var data = range.getValues();
  var headers = data.shift();
  Logger.log(data);
  var calId = "h22nevo15tm0nojb6ul4hu7ft8@group.calendar.google.com";
  var cal = CalendarApp.getCalendarById(calId);
  for (i in data) {
    var row = data[i];
    Logger.log(row);
    var date = new Date(row[0]);  // First column - Renewal Date
    var domain = row[1];          // Second column - Domain
    var client = row[2];          // Third column - Client
    var type = row[3];            // Fourth column - Type
    var source = row[4];          // Fifth column - Registrar
    var id = row[5];              // Sixth column - ID
    if(row[0]=="") continue;      // Skip rows if no date exists
    var title = type + " renewal for " + domain;
    var desc = "Renew with " + source + " for " + client;

    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventSeriesById(id);
      event.setTitle('got you');  // this is to "force error" if the event does not exist
    }catch (e) {
      var newEvent = cal.createAllDayEvent(title, date, {description:desc});
      row[5] = newEvent.getId();   // Update the data array with event ID
      Logger.log('event created'); // For debugging
      var event = cal.getEventSeriesById(row[5]);
    }
    event.setTitle(title);
    event.setDescription(desc);
    var recurrence = CalendarApp.newRecurrence().addYearlyRule();
    event.setRecurrence(recurrence, date);
    debugger;
    data[i] = row ;
  }
  // Record all event IDs to spreadsheet
  sheet.getRange(2,1,data.length,data[0].length).setValues(data);
}

【讨论】:

    【解决方案2】:

    我能够自己解决问题(尽管再次感谢 Serge 最初提供的一些出色帮助和可靠的答案,尽管在我解决问题之前我没有看到它)。这是我最终解决的代码:

    /**
     * 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 = 1;  // Number of rows of header info (to skip)
      var range = sheet.getDataRange();
      var data = range.getValues();
      var calId = "[id withheld]@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[0]);  // First column - Renewal Date
        var domain = row[1];          // Second column - Domain
        var client = row[2];          // Third column - Client
        var type = row[3];            // Fourth column - Type
        var source = row[4];          // Fifth column - Registrar
        var id = row[5];              // Sixth column - ID
        if(row[0]=="") continue;      // Check to see if date exists
        var title = type + " renewal for " + domain;
        var desc = "Renew with " + source + " for " + client;
    
        // Check if event already exists, update it if it does
        try {
          var event = cal.getEventSeriesById(id);
        }catch(e){
          //Do nothing
        }
        if(!event){
          var newEvent = cal.createAllDayEventSeries(title, date, CalendarApp.newRecurrence().addYearlyRule(), {description:desc});
          row[5] = newEvent.getId();   // Update the data array with event ID
          Logger.log('Event ID ' + row[5] + ' created'); // For debugging
        }
        else{
          var event = cal.getEventSeriesById(row[5]);
          event.setTitle(title);
          event.setDescription(desc);
          Logger.log('Event ID ' + row[5] + ' already exists'); //For debugging
        }
        debugger;
        data[i] = row ;
      }
      // Record all event IDs to spreadsheet
      range.setValues(data);
    }
    

    【讨论】:

    • 感谢您发现日期检查问题;我会纠正它。公平地说,我没有等待另一个回应的奢侈。我认识到您正在努力帮助找到解决方案,所以我至少不会因此而责怪您(我尊重您找到了另一个解决方案),但建议我没有“尝试”也是非常不尊重的在问之前很难。”也许下一次,把个人cmets排除在外。
    • 你说得对,我可能有点紧张或疲倦或两者兼而有之......,我将删除此评论 - 请接受我的道歉。
    • 谢谢。就其价值而言,根据我在其他答案中看到的情况,您确实在帮助解决这些问题方面做得非常扎实,我对此表示敬意,甚至超出了您对这个问题的帮助。
    • 太好了 ;-) 非常感谢并再次表示歉意。
    猜你喜欢
    • 2014-10-22
    • 2023-04-04
    • 1970-01-01
    • 2020-12-20
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多