InsertRowBefore последней строки, возвращающей ошибку

У меня есть сценарий, который (грубо, я знаю) записывает в электронную таблицу. Он динамически добавляет и удаляет строки на основе входных данных с другого листа. Мне нравится это делать, потому что пользователь должен скопировать и вставить полученные данные, отформатированные в таблицу, в электронное письмо после (давайте пока пропустим создание электронного письма непосредственно из этого скрипта, это вторая часть).

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

Я использовал getMaxRows (), getLastRow () и insertRowBefore (), но все комбинации этих функций возвращают ошибку «эти строки находятся за пределами границ»! Я действительно не понимаю, что происходит. Я использую журналы и вижу, как переменные getLastRow () и getMaxRows обновляются после того, как я сделал некоторое копирование таблицы шаблонов на лист, который затем «вставляет» строки. По какой-то причине даже после повторного вызова функций getMaxRows () и getLastRow () они не распознают новые строки. Скрипт все еще может управлять этими новыми строками.

Это наводит меня на мысль, что getMaxRows () и getLastRow () могут получить информацию о количестве строк в листе только при первом запуске скрипта или только при первой активации листа? Кто-нибудь раньше сталкивался с этой проблемой? У кого-нибудь есть подробности о том, как работают эти две функции? Страница класса "лист" GAS не помогла.

spread = SpreadsheetApp.getActiveSpreadsheet();
emailsSheet = spread.getSheetByName("emails");
emailsMaxRows = emailsSheet.getMaxRows(); //# of rows regardless of content.
emailsSheet.deleteRows(2,emailsMaxRows-1); //I want to start from scratch each time I run the script, having just 1 row from which I append 'template' boxes where I can put data for the user to copy and paste into emails.
emailsMaxRows = emailsSheet.getMaxRows(); //now that I've deleted, Logger.log() shows that getMaxRows() correctly updates with just 1 row.
emailsSheet.insertRowsBefore(emailsMaxRows, 2);//insert two more, so there are 3 rows in the sheet.
emailsMaxRows = emailsSheet.getMaxRows(); //logger correctly shows 3
templateEmail = spread.getRangeByName("templateEmail"); //email template, A1:E5
templateEmail.copyTo(emailsSheet.getRange(emailsMaxRows,1)); //paste a table of 5 rows to row 3, so there are 7 total.
emailsMaxRows = emailsSheet.getMaxRows(); //should be 7, no?
//NO. Logger shows MaxRow is still 3, how come????? I can visibly see in the sheet there are 7 rows, with formatting and text. I simply don't understand how getMaxRows() doesn't update to return 7.

Мне нужно либо getMaxRows (), либо getLastRow (), чтобы правильно обновлять каждый раз, когда я удаляю или вставляю строку, почему они не могут сделать это за меня?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SpreadsheetApp.flush () устранил проблему.

Спасибо, что поделились решением. Надеюсь, это поможет кому-нибудь с той же проблемой.

New_2_Code 14.09.2018 17:08

Пожалуйста. Насколько я могу судить, к сожалению, SpreadsheetApp.flush () потребуется после каждой функции записи / удаления, созданной в электронной таблице, чтобы действительно гарантировать, что действие обновляет все другие функции (например, getMaxRows ()). Это значительно увеличит время выполнения скриптов, которые вносят множество изменений (сотни, тысячи и т. д.).

Dylan Gimpelj 14.09.2018 17:18

Другие вопросы по теме