Импорт календаря — новые события, вставленные по дате, портят другие столбцы данных

#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 и это не пакетная операция, я не думаю, что это был бы лучший подход.