Как заставить скрипт приложения Google — календарь CreateEvent() принимать входные данные GSheet из ячеек, заполненных с помощью формулы массива

#javascript #google-apps-script #google-sheets #array-formulas

Вопрос:

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

 function addEvent() {
  let webinarCalendar = CalendarApp.getCalendarById("blablablablablabla@gmail.com");
  let calendarSheet = SpreadsheetApp.getActiveSheet();
  let schedule = calendarSheet.getDataRange().getValues();
  schedule.splice(0, 1);

  const k = 16; // colIndex of checkbok col
  const created = schedule.map(e => [e[k]]);
  schedule.forEach(function(entry, i) {
    if (entry[k] == true) { return; }
    webinarCalendar.createEvent(entry[3], entry[14], entry[15], {description: entry[13]});
    created[i][0] = true;
  });
  calendarSheet.getRange(2, k   1, created.length, 1).setValues(created);
}
 

Этот текущий код работал просто отлично до тех пор, пока 2 дня назад я не обновил 3 из 4 ячеек необходимыми входными данными для работы с формулой массива, чтобы они заполнялись автоматически при каждой новой записи строки.

Ошибка в консоли сценария приложения гласит : Исключение: Параметры (Строка,Строка,строка,(класс)) не соответствуют подписи метода для CalendarApp.Calendar.CreateEvent.

Параметры, необходимые для этого CreateEvent() в соответствии с документацией, — это заголовок(строка), время начала(строка), время завершения(строка) и описание(которое находится внутри объекта javascript, я думаю, и также является строкой). Чтобы убедиться, что тип данных каким-то образом не изменился в процессе создания формулы массива, я перекрестно проверил ячейки с помощью функции ISTEXT (), и все входные данные вернули значение TRUE.

Вторая попытка, которую я предпринял, состояла в том, чтобы изменить сращивание() с (0,1) на (0,2), чтобы он игнорировал первую строку, в ячейках которой записана формула массива, что также не решило проблему.

Я был бы очень признателен, если бы кто-нибудь показал мне, в чем причина этой проблемы, и помог мне ее исправить.

Комментарии:

1. Что мешает вам его отладить?

2. Я не знаю javascript. Я создаю веб-приложение python flask, в котором используются некоторые функции Google sheet, что привело меня к сценарию приложения Google, который, насколько я понимаю, является javascript для облачных приложений Google. Я намерен в ближайшее время должным образом изучить javascript, но в настоящее время я недостаточно квалифицирован, чтобы отладить эту проблему.

3. Пожалуйста, поделитесь копией своего листа.

4. Было бы полезно, если бы вы поделились примером своих входных данных.

5. Это лист, над которым я работаю. docs.google.com/spreadsheets/d/…

Ответ №1:

Я не знаю, почему это работало раньше, но startTime так и endTime должно быть Date .

Я проверил, что у вас есть колонки String .

Ссылка:

CreateEvent(название, время начала, время окончания, параметры)

Комментарии:

1. хорошо, странная часть заключается в том, что до того, как была введена формула массива, это было простое объединение ячеек даты и времени ,например =D2 E2 , и ввод этого в массив все равно приводил к той же ошибке. затем я изменил результат объединения в текстовый формат, думая, что это было то, что снова было не так. теперь я вернулся к простой конкатенации, которую я первоначально использовал внутри формулы массива, и добавил новую дату(запись [14]) и новую дату(запись[15]) . События были добавлены в тот день, и месяц был изменен на противоположный. Вместо 7 августа, как указано на листе, мероприятие было создано для 8 июля.

2. Я не уверен, но datestring формат new Date фиксирован и может не соответствовать практике некоторых округов. Может быть, вы можете попробовать TIMEVALUE формулу?

3. Я изменил формат даты внутри самого листа. это, похоже, решило проблему обратного хода. Но мне кажется, что мои дополнения в : webinarCalendar.createEvent(запись в[3], новая дата(записи[14]), новая дата(записи[15]), {описание: запись[13]}); , эта строка кода, кажется, очень неправильно, потому что даже если он получает работу, все остальные ячейки столбцов флажок получить достоверную текст, показывающий, когда выполнение заканчивается примерно за 5 минут. Где произошел взлом кода?

4. Я думаю, что код обрабатывает все оставшиеся 1000 строк по одной из 2 причин. во-первых, это связано с тем, что формула массива имеет ссылку на столбец практически до конца листа. Второе было бы связано с наличием проверки данных в виде выпадающего меню, которое также опускается до 1000 строк. Второй вариант не столь вероятен, так как я скопировал тот же лист с нуля без проверки данных, и все равно потребовалось около 5 минут, чтобы выполнить сценарий и получить все ячейки в столбце «Флажок» в виде текста после последнего флажка. Имеет ли это смысл?

5. можно ли добавить условие, чтобы остановить дальнейшую итерацию сценария, если вся или первая ячейка следующей строки пуста?