#javascript #arrays #google-apps-script #google-sheets #calendar
#javascript #массивы #google-apps-script #google-таблицы #Календарь
Вопрос:
Этот код — единственный, который работает для ввода моего общего календаря Google в лист. Я использую главный календарь для всех встреч в моем медицинском кабинете. Данные календаря представлены в 4 столбцах, столбцах B, C, D, E (из календаря (время начала, местоположение, описание, заголовок). Я добавил столбцы F — O с дополнительными данными, такими как «неявка», время прибытия, перенесено на другой день и формулы, которые вычисляют количество дней между встречами.
Когда события календаря обновляются из календаря в лист, мои добавленные столбцы F-O больше не соответствуют строке данных. Например, мои введенные данные «не показывать» для этой встречи будут в ячейке выше, где они должны быть. Как мне это исправить, чтобы новые строки данных добавлялись в нижнюю часть листа и оставались там, чтобы у меня не было перепутанных данных?
function importCalendar(){
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Calendar Import');
var calendarName = sheet.getRange('C2').getValue();
var start = sheet.getRange('C3').getValue();
var end = sheet.getRange('C4').getValue();
var calendar = CalendarApp.getCalendarById(calendarName);
if(calendar) {var calendarId = calendar.getId();}
if(!calendar) {
var calendar = CalendarApp.getCalendarsByName(calendarName)[0];
var calendarId = calendarName;
}
var events = calendar.getEvents(start, end);
var eventDetails = [];
for(var i = 0; i<events.length; i ){
eventDetails.push([events[i].getStartTime(), events[i].getTitle(), events[i].getDescription(), events[i].getLocation()]);
}
//write calendar details to spreadsheet
var startRow = 8;
var startCol = 2;
for(var j = 0; j<eventDetails.length; j ){
var tempRange = sheet.getRange(startRow j, startCol, 1, 4);
var eventArray = new Array(eventDetails[j]);
tempRange.setValues(eventArray);
}
return eventDetails;
}
Комментарии:
1. Почему
startRow
8?2. Строки 1-6 намеренно пустые, а строка 7 содержит мои заголовки.
Ответ №1:
Я полагаю, что ваш вопрос просто: «Как мне это исправить, чтобы новые строки данных добавлялись в нижнюю часть листа …?«
Прямо сейчас вы определили startRow = 8
, что означает, что вы всегда будете начинать печать с этой строки и перезаписывать все, что там есть. Вместо этого вы можете попробовать использовать getLastRow()
метод, который возвращает позицию последней строки с содержимым.
var startRow = sheet.getLastRow() 1; // Start one after the last row
Рекомендуется использовать пакетные операции. Это не всегда уместно, но я думаю, что это может быть в вашем случае. Если бы у вас было 5 событий для печати, прямо сейчас вы бы вызывали getRange()
и setValues()
5 раз, но вы можете очень легко обновить свой код, чтобы вызывать их только один раз для печати.
В качестве альтернативы вы могли бы использовать appendRow()
, но поскольку вы не печатаете в столбце A и это не пакетная операция, я не думаю, что это был бы лучший подход.