Повторяет функцию до тех пор, пока не будут выполнены определенные критерии? Google Sheets / Calendar API - PullRequest
0 голосов
/ 13 марта 2019

Ниже приведен скрипт, который я сейчас запускаю для загрузки данных о событиях из Google Calendars. Как написано в данный момент, он: 1) очищает лист каждый раз, когда он запускается, прежде чем заполняться новыми данными; 2) Запускается один раз по команде, извлекая идентификатор календаря из значения одной ячейки (D2)

У меня есть около 8 различных Cal ID, сохраненных на отдельном листе под названием «CalID», который я копирую / вставляю в ячейку D2 каждый раз, когда запускаю скрипт. Полный процесс: вставьте первый идентификатор Cal, запустите сценарий, скопируйте данные на другой лист, вставьте второй идентификатор Cal, запустите сценарий, скопируйте данные на другой лист ... повторяйте этот процесс, пока все 8 идентификаторов Cal не будут извлечены и скопированы в данные. другой лист.

Что я хотел бы сделать, это изменить этот скрипт, чтобы он работал так: Ссылка на ячейку A1 листа «CalID» для извлечения данных первого календаря, дамп на лист. Затем проверьте значение в A2 идентификаторов CalID - если оно не пустое, снова запустите скрипт, вытягивая данные 2-го календаря в лист, добавляя к существующим данным (не перезаписывая первые данные, поэтому я представляю команду типа «найти первую пустую строку») требуется). Продолжайте этот процесс, пока не будет найдена первая пустая ячейка Col A на CalID, а затем завершите.

Любая помощь о том, как это сделать? Я искал вокруг и не нашел ответов самостоятельно.

  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 голосов
/ 14 марта 2019

Я бы изменил ваш код следующим образом:

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

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();


}
}

Первая функция просматривает каждый календарь в списке, вторая записывает все события, а затем возвращает начальную строку следующего календаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...