Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script google gs将多个日历事件转换为电子表格_Google Apps Script - Fatal编程技术网

Google apps script google gs将多个日历事件转换为电子表格

Google apps script google gs将多个日历事件转换为电子表格,google-apps-script,Google Apps Script,试图从谷歌日历(总共三个)中提取全天的事件,并将其分为三个sheadsheet页面,每个页面包含两组三列数据。Max一个月大约有100行外卖。条目也可以按名称事件进行搜索 帮助,运行正常,但给了我一个暂停时间,这可能是因为有太多的信息,也有错误弹出了getTitle not found 任何有改进代码和防止超时的建议的人,或者任何其他整理代码的建议的人都会有所帮助。我先表示感谢。 这就是我目前所拥有的 function export_gcal_to_gsheet() { // This

试图从谷歌日历(总共三个)中提取全天的事件,并将其分为三个sheadsheet页面,每个页面包含两组三列数据。Max一个月大约有100行外卖。条目也可以按名称事件进行搜索

帮助,运行正常,但给了我一个暂停时间,这可能是因为有太多的信息,也有错误弹出了getTitle not found

任何有改进代码和防止超时的建议的人,或者任何其他整理代码的建议的人都会有所帮助。我先表示感谢。 这就是我目前所拥有的

    function export_gcal_to_gsheet() {
// This selects events only from calendars in date and list out 
// Export Google Calendars Events to a Google Spreadsheet
// This code retrieves events between 2 dates for the specified calendar.
// It logs the results in the current spreadsheet starting at cell A6 listing the      events,and date
// I do re-write the spreadsheet header in Row 6 with every run, as I found it faster to      delete then entire sheet content,
// 1. Please modify the value for mycal to be YOUR calendar email address or one visible on your MY Calendars section of your Google Calendar
// 2. Please modify the values for events to be the date/time range you want and any search parameters to find or omit calendar entires
// Note: Events can be easily filtered out/deleted once exported from the calendar
// from an original file export_gcal_to_gsheet
// Reference Websites:
// https://developers.google.com/apps-script/reference/calendar/calendar
// https://developers.google.com/apps-script/reference/calendar/calendar-event
var mycal="";
var mySite="canv";
switch (mySite) {
  case "canv"    : mycal = "*****orqjiaaosl0dt0qp0g@group.calendar.google.com"; break;
  case "salf"   : mycal = "*****juiigo83ich4iga7sttlpa4@group.calendar.google.com";  break;
  case "hart": mycal = "*****qblepqp88utr69vv434s@group.calendar.google.com"; break;
}//end switch

//var mycal = "*****hkdorqjiaaosl0dt0qp0g@group.calendar.google.com";
var cal = CalendarApp.getCalendarById(mycal);

// Optional variations on getEvents
// var events = cal.getEvents(new Date("January 3, 2014 00:00:00 CST"), new       Date("January 14, 2014 23:59:59 CST"));
// var events = cal.getEvents(new Date("January 3, 2014 00:00:00 CST"), new Date("January 14, 2014 23:59:59 CST"), {search: 'word1'});
// 
// Explanation of how the search section works (as it is NOT quite like most things   Google) as part of the getEvents function:
//    {search: 'word1'}              Search for events with word1
//    {search: '-word1'}             Search for events without word1
var eventsbell = cal.getEvents(new Date("May 1, 2014 00:00:00 GMT"), new Date("May 10, 2014 23:59:59 GMT"), {search: 'bell'});
var eventspers = cal.getEvents(new Date("May 1, 2014 00:00:00 GMT"), new Date("May 2, 2014 23:59:59 GMT"), {search: 'pers'});

//var sheet = SpreadsheetApp.getActiveSheet();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mySite);
// Uncomment this next line if you want to always clear the spreadsheet content before   running - Note people could have added extra columns on the data though that would be lost
sheet.clearContents();  

// Create a header record on the current spreadsheet in cells A5:C5,E5:G5 - Match the number of entries in the "header=" to the last parameter
// of the getRange entry below
var header = [["Delivery Branch test", "Customer and Site test", "Delivery Date test"]]
var rangebell = sheet.getRange(5,1,1,3);
rangebell.setValues(header);
var rangepers = sheet.getRange(5,5,1,3);
rangepers.setValues(header);

// Loop through all calendar events found and write them out starting on calculated ROW 6 (i+6)
for (var i=0;i<eventsbell.length;i++) {
var row=i+6;
for (var i=0;i<eventspers.length;i++) {
var row=i+6;
// Matching the "header=" entry above, this is the detailed row entry "details=", and must match the number of entries of the GetRange entry below
var detailsbell = [[ mycal,eventsbell[i].getTitle(),eventsbell[i].getStartTime()]];
var rangebell = sheet.getRange(row,1,1,3);
rangebell.setValues(detailsbell);
var detailspers = [[ mycal,eventspers[i].getTitle(),eventspers[i].getStartTime()]];
var rangepers = sheet.getRange(row,5,1,3);
rangepers.setValues(detailspers);
}
}
}
function export\u gcal\u to\u gsheet(){
//这将仅从“日期输入”和“列表输出”日历中选择事件
//将Google日历事件导出到Google电子表格
//此代码检索指定日历的两个日期之间的事件。
//它将结果记录在当前电子表格中,从单元格A6开始,列出事件和日期
//每次运行时,我都会在第6行重新编写电子表格标题,因为我发现删除整个工作表内容的速度更快,
//1.请将mycal的值修改为您的日历电子邮件地址或在您的Google日历的“我的日历”部分可见的地址
//2.请将事件的值修改为所需的日期/时间范围,并修改任何搜索参数以查找或忽略日历实体
//注意:一旦从日历中导出,事件就可以很容易地过滤/删除
//从原始文件导出\u gcal\u到\u gsheet
//参考网站:
// https://developers.google.com/apps-script/reference/calendar/calendar
// https://developers.google.com/apps-script/reference/calendar/calendar-event
var mycal=“”;
var mySite=“canv”;
交换机(mySite){
案例“canv”:mycal=”*****orqjiaaosl0dt0qp0g@group.calendar.google.com“休息;
案例“salf”:mycal=”*****juiigo83ich4iga7sttlpa4@group.calendar.google.com“休息;
案例“hart”:mycal=”*****qblepqp88utr69vv434s@group.calendar.google.com“休息;
}//终端开关
//var mycal=”*****hkdorqjiaaosl0dt0qp0g@group.calendar.google.com";
var cal=CalendarApp.getCalendarById(mycal);
//getEvents的可选变体
//var事件=cal.getEvents(新日期(“2014年1月3日00:00:00 CST”)、新日期(“2014年1月14日23:59:59 CST”);
//var events=cal.getEvents(新日期(“2014年1月3日00:00:00 CST”)、新日期(“2014年1月14日23:59:59 CST”)、{search:'word1'};
// 
//作为getEvents函数的一部分,解释搜索部分的工作原理(因为它与Google的大多数内容不太一样):
//{search:'word1'}使用word1搜索事件
//{search:'-word1'}搜索不带word1的事件
var eventsbell=cal.getEvents(新日期(“2014年5月1日00:00:00 GMT”)、新日期(“2014年5月10日23:59:59 GMT”)、{search:'bell'});
var eventspers=cal.getEvents(新日期(“2014年5月1日00:00:00 GMT”)、新日期(“2014年5月2日23:59:59 GMT”)、{search:'pers'});
//var sheet=SpreadsheetApp.getActiveSheet();
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mySite);
//如果您希望在运行之前始终清除电子表格内容,请取消对下一行的注释-注意,人们可能会在数据上添加额外的列,但这将丢失
sheet.clearContents();
//在单元格A5:C5、E5:G5中的当前电子表格上创建标题记录-将“header=”中的条目数与最后一个参数匹配
//下面的getRange条目的
var头=[[“交付分支测试”、“客户和现场测试”、“交付日期测试”]]
var rangebell=表.getRange(5,1,1,3);
rangebell.setValues(标题);
var rangepers=表的getRange(5,5,1,3);
量程设置值(表头);
//循环浏览找到的所有日历事件,并从计算出的第6行(i+6)开始写出它们

对于(var i=0;i我不久前写了这样一个脚本,一直在使用它,没有任何问题。下面是它的简化版本,您可以尝试看看它最终是否适合您

代码有点长,但是操作非常简单,所以我想可能没有办法让它变得更短

我知道这段代码中使用的一些方法正在被弃用(例如getTimeZone),但当它们变得不可用时很容易更新…现在它可以正常工作,我会在有时间时更新它

这是

var FUS1=newdate().toString().substr(25,6)+“:00”;
var tz=SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone();
函数onOpen(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
变量菜单项=[
{name:“ImportCalendars”,functionName:“Cal_to_sheetM”},
];  
ss.添加菜单(“导入CAL”,菜单);
}
函数Cal_to_sheetM(){
var doc=SpreadsheetApp.getActiveSpreadsheet();
var app=UiApp.createApplication().setTitle(“导入日历”);
安装高度(365)、安装宽度(600);
//创建包含3个文本框和相应标签的网格
var grid=app.createGrid(6,2);
var wait=app.createImage('https://dl.dropboxusercontent.com/u/211279/loading3.gif)。设置为可见(假);
setWidget(0,0,app.createLabel(“Cal名称”);
var list=app.createListBox(true).setVisibleItemCount(5);
list.setName(“日历”);
setWidget(0,1,list);
var calendars=CalendarApp.getAllCalendars();
对于(var i=0;ivar FUS1=new Date().toString().substr(25,6)+":00";
var tz = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone();

function onOpen() {   
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [
    {name: "ImportCalendars", functionName: "Cal_to_sheetM"},  
  ];  
  ss.addMenu("import cals", menuEntries);  
}



function Cal_to_sheetM() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var app = UiApp.createApplication().setTitle("Import Calendars");
  app.setHeight(365).setWidth(600);
  // Create a grid with 3 text boxes and corresponding labels
  var grid = app.createGrid(6, 2);
  var wait = app.createImage('https://dl.dropboxusercontent.com/u/211279/loading3.gif').setVisible(false);
  grid.setWidget(0, 0, app.createLabel("Cal Names :"));
  var list = app.createListBox(true).setVisibleItemCount(5);
  list.setName('calendar');
  grid.setWidget(0, 1, list);
  var calendars = CalendarApp.getAllCalendars();
  for (var i = 0; i < calendars .length; i++) {
    list.addItem(calendars[i].getName());
  }
  list.setItemSelected(0, true);
  grid.setWidget(1, 0, app.createCheckBox("add cal Name to events").setName('addName').setValue(false))
      .setWidget(2, 0, app.createLabel('start Date :'))
      .setWidget(2, 1, app.createDateBox().setId("start").setValue(new Date(PropertiesService.getScriptProperties().getProperty('startDate'))))
      .setWidget(3, 0, app.createLabel('End Date :'))
      .setWidget(3, 1, app.createDateBox().setId("end").setValue(new Date(PropertiesService.getScriptProperties().getProperty('endDate'))))
      .setWidget(4,0, app.createCheckBox("create new sheet").setName('newsheet').setValue(false));
  var panel = app.createVerticalPanel();
  panel.add(grid);
  var button = app.createButton('Import');
  var handler = app.createServerClickHandler('importEventsMulti');
  handler.addCallbackElement(grid);
  var cHandler = app.createClientHandler().forTargets(wait).setVisible(true).forEventSource().setEnabled(false);
  button.addClickHandler(handler).addClickHandler(cHandler);
  grid.setWidget(5, 1,button).setWidget(4,1, wait);
  app.add(panel.add(grid));
  doc.show(app);
}


function importEventsMulti(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var calendar_name = e.parameter.calendar.split(',');
  var addName = e.parameter.addName=='true';
  var newsheet = e.parameter.newsheet=='true';
  var empty = ''
  var startDate = new Date(e.parameter.start);
  var endDate = new Date(e.parameter.end);
  var sheetName = calendar_name.join('&');
  if(newsheet){
      try{ 
    var sheet = ss.insertSheet(sheetName,0);
      }catch(error){
        FUS1=new Date().toString().substr(25,6)+":00";
        var sheet = ss.insertSheet(sheetName+'-'+Utilities.formatDate(new Date(), FUS1, "HH:mm:ss"),0);
        }
  }else{
    var allSheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
    var sheetNames = '';
    for(var s in allSheets){sheetNames+=allSheets[s].getName()};
    if(sheetNames.indexOf(sheetName)>-1){
        var newsheetName = sheetName+'-'+Utilities.formatDate(new Date(), FUS1, "HH:mm:ss")  
    }else{
        var newsheetName = sheetName
        }
        var sheet = ss.getActiveSheet().setName(newsheetName); 
  }
  var eventArray = new Array();
    for(n=0;n<calendar_name.length;++n){
//Logger.log(calendar_name[n])      
      var Calendar = CalendarApp.getCalendarsByName(calendar_name[n]);
      var events = Calendar[0].getEvents(startDate , endDate, {max: 4000});
      if (events[0]){
        for (i = 0; i < events.length; i++) {
          var line = new Array();
          FUS1=events[i].getStartTime().toString().substr(25,6)+":00";
          var title = events[i].getTitle()
          if(addName){title+=(' ('+calendar_name[n]+')')}
          line.push(title);
          line.push(Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MM-yyyy")+' @ ' +Utilities.formatDate(events[i].getStartTime(), FUS1, "HH:mm"));
          line.push(Utilities.formatDate(events[i].getEndTime(), FUS1, "dd-MM-yyyy")+' @ ' +Utilities.formatDate(events[i].getEndTime(), FUS1, "HH:mm"));
          line.push(events[i].getLocation());
          line.push(' -- ')
          line.push(((events[i].getEndTime() - events[i].getStartTime())/ 3600000).toString().replace('.',','));
          line.push(' ')
          eventArray.push(line);
        }
      }else {
    var startstring = Utilities.formatDate(e.parameter.start, FUS1, "dd-MM-yyyy");
    var endstring = Utilities.formatDate(e.parameter.end, FUS1, "dd-MM-yyyy");
    empty += calendar_name[n]+' - ';
  }
    }
  if(empty.length>1){ 
    Browser.msgBox('No events between ' + startstring + ' and ' + endstring +' in these calendars :'+empty);
  }
//Logger.log(eventArray)
    eventArray.sort(function(x,y){
      var xp = new Date(x[1].substr(6,4)+'/'+x[1].substr(3,2)+'/'+x[1].substr(0,2)+' '+x[1].substr(13,2)+':'+x[1].substr(16,2)+':00').getTime();
      var yp = new Date(y[1].substr(6,4)+'/'+y[1].substr(3,2)+'/'+y[1].substr(0,2)+' '+y[1].substr(13,2)+':'+y[1].substr(16,2)+':00').getTime();
      return xp == yp ? 0 : xp > yp ? 1 : -1;
      });
    // now check for any double entry starting from the end
    var eventArrayN = [];
    var doublons = [];
    for(i in eventArray){
      var row = eventArray[i];
      var duplicate = false;
      for(j in eventArrayN){
        if(row.join() == eventArrayN[j].join()){
          duplicate = true;
        }
      }
      if(!duplicate){
        eventArrayN.push(row);
      }else{
        doublons.push(row);
      }
    }  
    var titre = ['calendars '+calendar_name.join(' + '),'starting ','ending','Ressources','--','duration','totals'];
          eventArrayN.unshift(titre);
//Logger.log(eventArrayN.length);
//    ss.setActiveSheet(ss.getSheets()[1]);   
    var lastRow = sheet.getLastRow();
    sheet.getDataRange().clearContent().setBorder(false,false,false,false,false,false).setBackgroundColor('#ffffff')
    sheet.getRange(1,1,eventArrayN.length,eventArrayN[0].length).setValues(eventArrayN);
    sheet.setColumnWidth(1, 450).setColumnWidth(2, 150).setColumnWidth(3, 150).setColumnWidth(4, 250).setColumnWidth(5, 120).setColumnWidth(6, 75).setColumnWidth(7, 450);;
    sheet.setFrozenRows(1)
    sheet.getRange(1,1,1,eventArrayN[0].length).setBorder(true,true,true,true,true,true).setBackgroundColor('#cccccc').setFontWeight('bold').setHorizontalAlignment('center');
    sheet.getRange('G' + (eventArrayN.length+1)).setValue('Total (global)').setBorder(true,true,true,true,true,true).setBackgroundColor('#cccccc');
    sheet.getRange('F' + (eventArrayN.length+1)).setFormula('=SUM(F2:F' + (eventArrayN.length)+ ')').setBorder(true,true,true,true,true,true).setBackgroundColor('#cccccc');
    var max = sheet.getMaxColumns();
    var cstart = sheet.getLastColumn(); 
    var n ;
  for(n=max;n>cstart;--n){sheet.deleteColumn(n)}
  var app = UiApp.getActiveApplication();
  app.close();
  if(doublons.length>0){
    Browser.msgBox("There are duplicates in "+sheetName+", see log sheet");
    var sheet = ss.insertSheet('LOG-'+Utilities.formatDate(new Date(), FUS1, "HH:mm:ss"),1);
    Utilities.sleep(1500);
    var titre = ['calendar : '+calendar_name.join(' + '),'start ','end','Ressources','--','Duration',' comments '];
    doublons.unshift(titre);
    sheet.getRange(1,1,doublons.length,doublons[0].length).setValues(doublons)
    sheet.setColumnWidth(1, 450).setColumnWidth(2, 150).setColumnWidth(3, 150).setColumnWidth(4, 250).setColumnWidth(5, 120).setColumnWidth(6, 75).setColumnWidth(7, 450);;
    sheet.setFrozenRows(1)
    sheet.getRange(1,1,1,eventArrayN[0].length).setBorder(true,true,true,true,true,true).setBackgroundColor('#cccccc').setFontWeight('bold').setHorizontalAlignment('center');
    sheet.getRange('G' + (eventArrayN.length+1)).setValue('Total global').setBorder(true,true,true,true,true,true).setBackgroundColor('#cccccc');
    sheet.getRange('F' + (eventArrayN.length+1)).setFormula('=SUM(F2:F' + (eventArrayN.length)+ ')').setBorder(true,true,true,true,true,true).setBackgroundColor('#cccccc');
    var max = sheet.getMaxColumns();
    var cstart = sheet.getLastColumn(); 
    var n ;
  for(n=max;n>cstart;--n){sheet.deleteColumn(n)}
  }
  PropertiesService.getScriptProperties().setProperty('startDate',startDate);
  PropertiesService.getScriptProperties().setProperty('endDate',endDate);
  return app;  
}