#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 Спасибо за ответ. Я рад, что ваша проблема была решена.