重复执行功能,直到满足某些条件? Google表格/日历API

时间:2019-03-13 17:37:08

标签: google-apps-script google-sheets

以下是我当前运行的脚本,用于从Google日历下载事件数据。它的当前编写方式为:1)每次运行时清除工作表,然后再填充新数据; 2)在命令上运行一次,从单个单元格(D2)值中提取日历ID

我将大约8个不同的Cal ID保存到称为“ CalIDs”的单独工作表中,每次运行脚本时,我都会将其复制/粘贴到单元格D2中。完整的过程是:粘贴第一个Cal ID,运行脚本,将数据复制到另一个工作表中,粘贴第二个Cal ID,运行脚本,将数据复制到另一个工作表中...重复此过程,直到将所有8个Cal ID的数据都提取并复制到其他工作表。

我想做的就是修改此脚本,使其运行如下: “ CalIDs”工作表的引用单元格A1提取第一个日历的数据,转储到工作表中。然后检查Cal2的A2中的值-如果不为空,请再次运行脚本,将第二个日历的数据拉入工作表,追加到现有数据中(不覆盖第一个数据,因此我想“查找第一个空行”类型的命令是需要)。继续此过程,直到找到CalID上Col A的第一个空单元格,然后结束。

有关如何执行此操作的任何帮助?我到处搜寻,但自己未找到任何答案。

  function CalendarDownload(){  

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(sheet.getSheetByName('PULL'))

  var mycal = SpreadsheetApp.getActiveSheet().getRange("c2").getValue(); // PULL CALENDAR ID FROM CELL   
  var cal = CalendarApp.getCalendarById(mycal);
  var startdate = SpreadsheetApp.getActiveSheet().getRange("a2").getValue()  // SET THE DATE OF SEARCH RANGE
  var enddate = SpreadsheetApp.getActiveSheet().getRange("b2").getValue()   // SET THE DATE OF SEARCH RANGE
  var editor = SpreadsheetApp.getActiveSheet().getRange("d2").getValue()   // COLLECT CALENDER ID FROM CELL
  var events = cal.getEvents(startdate, enddate); // SET THE DATE OF SEARCH RANGE

var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(4, 1, sheet.getLastRow(), 9).clear({contentsOnly:true});

// Create a header record on the current spreadsheet in cells A1:N1 - Match the number of entries in the "header=" to the last parameter of the getRange entry below
var header = [["Event Start", "Event End", "Description", "EDITOR", "DURATION", "PROD #", "PHASE", "NOTES"]]
var range = sheet.getRange(3,1,1,8);
range.setValues(header);

// Loop through all calendar events found and write them out starting on calulated ROW 3 (i+3)
for (var i=0;i<events.length;i++) {
var row=i+4;
var myformula_placeholder = '';
var details=[[events[i].getStartTime(), events[i].getEndTime(), events[i].getTitle(), editor]];
var range=sheet.getRange(row,1,1,4);
range.setValues(details);

 var cell=sheet.getRange(row,5);
cell.setFormula('=(HOUR(B' +row+ ')+(MINUTE(B' +row+ ')/60))-(HOUR(A' +row+ ')+(MINUTE(A' +row+ ')/60))');
cell.setNumberFormat('.00');



}
}

1 个答案:

答案 0 :(得分:0)

我会这样修改您的代码:

//******************************************************************************

function allCalendars(){
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var ss = sheet.getSheetByName('PULL');
      var os = sheet.getSheetByName('CalIds');
      var start = 2;
      ss.getRange(4, 1, ss.getLastRow(), 9).clear({contentsOnly:true});
      var data = os.getDataRange().getValues();
      for (var i=0; i<data.length;i++)
        {
            start = CalendarDownload(start,data[i][0]);
        }//for loop

}//*****************************************************************************

然后我修改了CalendarDownload一点:

function CalendarDownload(start,mycal){  

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
SpreadsheetApp.setActiveSheet(sheet.getSheetByName('PULL'))

  var cal = CalendarApp.getCalendarById(mycal);
  var startdate = SpreadsheetApp.getActiveSheet().getRange("a2").getValue()  // SET THE DATE OF SEARCH RANGE
  var enddate = SpreadsheetApp.getActiveSheet().getRange("b2").getValue()   // SET THE DATE OF SEARCH RANGE
  var editor = SpreadsheetApp.getActiveSheet().getRange("d2").getValue()   // COLLECT CALENDER ID FROM CELL
  var events = cal.getEvents(startdate, enddate); // SET THE DATE OF SEARCH RANGE



// Create a header record on the current spreadsheet in cells A1:N1 - Match the number of entries in the "header=" to the last parameter of the getRange entry below
var header = [["Event Start", "Event End", "Description", "EDITOR", "DURATION", "PROD #", "PHASE", "NOTES"]]
var range = sheet.getRange(3,1,1,8);
range.setValues(header);

// Loop through all calendar events found and write them out starting on calulated ROW 3 (i+3)
for (var i=0;i<events.length;i++) {
var row=i+4;
var myformula_placeholder = '';
var details=[[events[i].getStartTime(), events[i].getEndTime(), events[i].getTitle(), editor]];
var range=sheet.getRange((start+row),1,1,4);
range.setValues(details);

 var cell=sheet.getRange(row,5);
cell.setFormula('=(HOUR(B' +row+ ')+(MINUTE(B' +row+ ')/60))-(HOUR(A' +row+ ')+(MINUTE(A' +row+ ')/60))');
cell.setNumberFormat('.00');

return sheet.getLastRow();


}
}

第一个函数循环遍历列表中的每个日历,第二个函数写入所有事件,然后返回下一个日历的起始行。