#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
Ниже приведен скрипт, который я в настоящее время запускаю для загрузки данных о событиях из Календарей Google. То, как это написано в настоящее время, это: 1) Очищает лист при каждом запуске перед заполнением новыми данными; 2) Запускается один раз по команде, извлекая идентификатор календаря из значения одной ячейки (D2)
У меня есть около 8 разных идентификаторов Cal, сохраненных на отдельном листе под названием ‘CalIDs’, который я буду копировать / вставлять в ячейку D2 каждый раз, когда я запускаю скрипт. Полный процесс таков: вставьте первый идентификатор пользователя, запустите скрипт, скопируйте данные на другой лист, вставьте второй идентификатор пользователя, запустите скрипт, скопируйте данные на другой лист… повторяйте этот процесс до тех пор, пока все 8 идентификаторов Cal не будут извлечены и скопированы на другой лист.
Что я хотел бы сделать, так это изменить этот скрипт, чтобы он выполнялся следующим образом: Ссылка на ячейку A1 листа ‘CalIDs’ для извлечения данных первого календаря, выгрузка в лист. Затем проверьте значение в A2 CalIDs — если оно не пустое, запустите скрипт снова, перенося данные этого 2-го календаря на лист, ДОБАВЛЯЯ к существующим данным (не перезаписывая первые данные, поэтому я полагаю, что требуется команда типа «найти первую пустую строку»). Продолжайте этот процесс, пока не будет найдена первая пустая ячейка столбца A в CalIDs, затем завершите.
Любая помощь о том, как это сделать? Я искал вокруг и сам не нашел никаких ответов.
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. Здесь есть абсолютно вопросы об определении первой пустой строки в определенном столбце. Служба электронных таблиц также предоставляет полезный метод класса sheet.
2. Да, чтобы прояснить мой комментарий, я понимаю этот код, но не могу понять, как он используется в функции повтора / цикла. Рад провести исследование, но не уверен, с чего начать или какие ключевые слова искать здесь.
Ответ №1:
Я бы изменил ваш код следующим образом:
//******************************************************************************
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();
}
}
Первая функция перебирает каждый календарь в списке, вторая записывает все события, а затем возвращает начальную строку для следующего календаря.