Исключение: неожиданная ошибка при получении метода или свойства setNumberFormats для объекта SpreadsheetApp.Range — существующий ответ мне не помогает

#google-apps-script #google-sheets

#google-apps-script #google-sheets

Вопрос:

Я нашел точно такой же вопрос здесь, но я не думаю, что ответ мне поможет.

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

 function addTrans(transInfoJSON){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("Transactions");
  
  var transInfo = JSON.parse(transInfoJSON);
  
  ws.appendRow([generateID("TRANS"),
                transInfo.code,
                transInfo.cust_Id,
                transInfo.date,
                transInfo.description,
                transInfo.rate,
                transInfo.hours,
                transInfo.amntIn,
                transInfo.out]);
  
  var rngNewRow = ws.getRange(ws.getLastRow(), 4, 1, 7);
  var arrFormatsArray = [
    ["dd/mm/yyyy",,"£#,##0.00",,"£#,##0.00","£#,##0.00","£#,##0.00"]
    ];
  
  rngNewRow.setNumberFormats(arrFormatsArray);
}
 

Добавление работает, но когда оно доходит до последней строки, я получаю сообщение об ошибке.

Благодаря новому редактору сценариев Google Apps он выделяет совпадающие объекты, поэтому, когда я нажимаю на имя своей переменной, оно выделяет имя, переданное в setNumberFormats метод, даже если я не проверял его по буквам.

Массив имеет правильный размер, строки формата соответствуют спецификации. Я просто не понимаю, почему метод выдает ошибку.

Первоначально было .amntIn вызвано свойство моего объекта .in , которое, как я теперь понимаю, является зарезервированным словом, поэтому я изменил это, но это не помогло.

TIA.

Ответ №1:

Я думаю, что причина вашей проблемы связана с неопределенным значением в ["dd/mm/yyyy",,"£#,##0.00",,"£#,##0.00","£#,##0.00","£#,##0.00"] . В этом ответе я хотел бы предложить следующие 2 шаблона.

Шаблон 1:

В этом шаблоне числовой формат перезаписывается значением перед setNumberFormats использованием.

Модифицированный сценарий:

Пожалуйста, измените свой сценарий следующим образом.

От:

 var rngNewRow = ws.getRange(ws.getLastRow(), 4, 1, 7);
var arrFormatsArray = [
  ["dd/mm/yyyy",,"£#,##0.00",,"£#,##0.00","£#,##0.00","£#,##0.00"]
  ];

rngNewRow.setNumberFormats(arrFormatsArray);
 

Для:

 var rngNewRow = ws.getRange(ws.getLastRow(), 4, 1, 7);
var defFormats = rngNewRow.getNumberFormats()[0];
var arrFormatsArray = [
  ["dd/mm/yyyy",defFormats[1],"£#,##0.00",defFormats[3],"£#,##0.00","£#,##0.00","£#,##0.00"]
];
rngNewRow.setNumberFormats(arrFormatsArray);
 

Шаблон 2:

Когда я увидел ваш скрипт, кажется, что используются 2 числовых формата dd/mm/yyyy и £#,##0.00 . Так что в этом шаблоне dd/mm/yyyy и £#,##0.00 задается 2 setNumberFormat() .

Модифицированный сценарий:

Пожалуйста, измените свой сценарий следующим образом.

От:

 var rngNewRow = ws.getRange(ws.getLastRow(), 4, 1, 7);
var arrFormatsArray = [
  ["dd/mm/yyyy",,"£#,##0.00",,"£#,##0.00","£#,##0.00","£#,##0.00"]
  ];

rngNewRow.setNumberFormats(arrFormatsArray);
 

Для:

 var lastRow = ws.getLastRow();
ws.getRange(lastRow, 4).setNumberFormat("dd/mm/yyyy");
ws.getRangeList([ws.getRange(lastRow, 6, 1, 1).getA1Notation(), ws.getRange(lastRow, 8, 1, 3).getA1Notation()]).setNumberFormat("£#,##0.00");
 

Примечание:

  • Над измененным сценарием используется служба электронных таблиц. Если вы хотите достичь своей цели, например, одним вызовом, я думаю, что вы также можете достичь своей цели, используя метод batchUpdate API Sheets. Если вам это нужно, пожалуйста, скажите мне.

Ссылка:

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

1. Спасибо, оба эти метода сработали. Шаблон 2 в среднем был немного быстрее, чем шаблон 1, согласно журналу выполнения Google, что меня удивило, поэтому я могу придерживаться этого. Я удивлен, что это перестало работать, и документация не изменилась, чтобы отразить, что массив форматов не может содержать пустых значений.

2. @Martin Bannister Спасибо за ответ. Я рад, что ваша проблема была решена.