Google apps script 谷歌日历应用程序脚本定期将数据拉入电子表格

Google apps script 谷歌日历应用程序脚本定期将数据拉入电子表格,google-apps-script,google-calendar-api,google-spreadsheet-api,Google Apps Script,Google Calendar Api,Google Spreadsheet Api,我一直在使用这个脚本将数据从谷歌日历拉到电子表格中。我有几个问题需要改进: 是否可以将多个日历中的数据拉到同一个电子表格中,而不使它们相互覆盖 是否可以让it部门在电子表格中添加一列新的数据,标记每行来自哪个日历 另外,您将如何设置它以每24小时自动运行一次 谢谢 function caltest3(){ var ss = SpreadsheetApp.openById("SPREADSHEET ID"); SpreadsheetApp.setActiveSpreadsheet(ss);

我一直在使用这个脚本将数据从谷歌日历拉到电子表格中。我有几个问题需要改进:

  • 是否可以将多个日历中的数据拉到同一个电子表格中,而不使它们相互覆盖
  • 是否可以让it部门在电子表格中添加一列新的数据,标记每行来自哪个日历
  • 另外,您将如何设置它以每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);
        }
      }
    }
    
    函数caltest3(){
    var ss=电子表格应用程序openById(“电子表格ID”);
    SpreadsheetApp.setActiveSpreadsheet(ss);
    var cal=CalendarApp.getCalendarById(“日历ID”);
    var sheet=SpreadsheetApp.getActiveSheet();
    var事件=cal.getEvents(新日期(“2013年1月1日”)、新日期(“2013年1月13日”);
    
    对于(var i=0;i简短回答,请举例:

  • 您无法通过调用
    CalendarApp
    来完成此操作,但如果您循环遍历CalendarID列表并将该日历的结果事件添加到数组中,则可以对该数组进行排序并将其放入电子表格中
  • 只需将日历名称(或id)作为另一项添加到
    details
    数组中,只需记住将范围列计数增加
    1
  • 将脚本触发器添加到您想要的任何时间段,最好的描述就是这样
  • 无论您是从多个日历构建日历事件数组,还是仅从一个日历构建日历事件数组,将它们添加到循环中的数组中,然后将它们写入任何循环外的电子表格都比每次调用
    getRange()时逐行写入更好
    &
    setValues
    方法它们是单独的API调用,对于应用程序脚本来说,这些调用在时间上是最昂贵的。在适合您的数据的范围内,每次只调用一次,您的脚本将运行快一个数量级

    下面的脚本演示了答案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);
    }
    
    函数caltest3(){
    var ss=SpreadsheetApp.openById('spreadsheetId'),
    sheet=ss.getSheetByName('sheetName'),
    cals=['id1','id2','id3'],c,cal,calName,
    开始=新日期('where'),结束=新日期('where'),
    事件,我,细节,,
    eventslog=[],e,
    行=[],范围;
    对于(c=0;c
    为清晰起见,代码隔开


    你所有的问题都是肯定的……但需要一些启发:如果每24小时运行一次,我想在特定的时间段内查找事件?什么时间段?24小时?有多少日历?为什么每个日历不一张表?你想按cal名称还是按时间对事件进行分类?每次都是相同的时间段,1/4年,而且会有电子表格中的函数用于从未来对过去的项目进行排序。可能是4个日历,需要对它们进行聚合,然后数据将在电子表格中进行排序。我不确定分类依据在这里指的是什么?日历名称和时间都应该是传递的详细信息。我希望它们按时间排序。而不是ks谢谢你的帮助!我在这一行得到一个语法错误:rows[]=eventslog.map(function(entry){return entry.details;});我在这一行也得到了一个“sheets not defined”错误:for(c=0;crows[]
    应该是
    rows
    ——上次我在没有测试的情况下直接向stackoverflow编写代码