3

我一直在使用此脚本将 Google 日历中的数据提取到电子表格中。我有几个问题需要改进:

  1. 是否可以将多个日历中的数据拉到同一个电子表格中,而不会相互覆盖?
  2. 是否可以让它在电子表格中添加一个新的数据列来标记每行来自哪个日历?
  3. 另外,您将如何将其设置为每 24 小时自动运行一次?

谢谢!

function caltest3(){
  var ss = SpreadsheetApp.openById("SPREADSHEET ID");
  SpreadsheetApp.setActiveSpreadsheet(ss);
  var cal=CalendarApp.getCalendarById("CALENDAR ID");
  var sheet = SpreadsheetApp.getActiveSheet();

  var events = cal.getEvents(new Date("January 1, 2013"), new Date("January 13, 2013"));
for (var i=0;i<events.length;i++) {
  //http://www.google.com/google-d-s/scripts/class_calendarevent.html
      var details=[[events[i].getTitle(), events[i].getStartTime(),            
                    events[i].getEndTime(), events[i].getDescription(),
                    events[i].getLocation()]];
  var row=i+1;
  var range=sheet.getRange(row+1,1,1,5);
  range.setValues(details);
    }
  }
}
4

1 回答 1

3

简短的答案,然后是一个例子:

  1. 您不能通过单次调用来执行此操作CalendarApp,但如果您遍历 calendarIds 列表并将该日历的结果事件添加到数组中,则可以对该数组进行排序并将其放入电子表格
  2. 只需将日历名称(或 ID)添加为details数组中的另一个项目,只需记住将范围列数增加1
  3. 将脚本触发器添加到您想要的任何时间段,文档对此进行了最好的描述。

getRange()无论您是从多个日历还是仅一个日历构建一组日历事件,都将它们循环添加到数组中,然后将它们写入任何循环之外的电子表格,这比每次调用&setValues方法时逐行写入更好的做法它们是单独的 API 调用,这些调用对于 Apps 脚本来说是最昂贵的时间。每个只调用一次,其范围适合您的数据,您的脚本运行速度将提高一个数量级。

下面的脚本说明了答案 1 和 2。如果您为此设置计时器,您的需求可能会有所不同,因为您可能希望影响查询的时间段?

function caltest3(){

  var ss = SpreadsheetApp.openById( 'spreadsheetId' ),
      sheet = ss.getSheetByName( 'sheetName' ),
      cals = ['id1', 'id2', 'id3'], c, cal, calName,
      start = new Date( 'whenever' ), end = new Date( 'whenever' ),
      events, i, details,
      eventslog = [], e,
      rows = [], range;

  for (c = 0; c < cals.length; c += 1) {

    cal = CalendarApp.getCalendarById(cals[c]);
    calName = cal.getTitle();
    events = cal.getEvents(start, end);

    // add the events of the current calendar to the array of all events
    eventslog = eventslog.concat(
      events.map(function(event) {
        return {
          time: new Date(event.getStartTime()).getTime(), // sort by this
          details: [
            event.getTitle(),
            event.getStartTime(),
            event.getEndTime(),
            event.getDescription(),
            event.getLocation(),
            calName // change calendar info position in array to suit
          ]
        };
      })
    );
  }

  // sort array of event so date order can be either way by reversing a & b
  eventslog.sort(function(a, b) { return a.time - b.time; });

  rows = eventslog.map(function(entry) { return entry.details; });

  range = sheet.getRange(2, 1, rows.length, 6);
  range.setValues(rows);
}

为了清楚起见,代码间隔开

于 2013-01-20T00:09:40.137 回答