例外:在对象 SpreadsheetApp.Range 上获取方法或属性 setNumberFormats 时出现意外错误 - 现有答案对我没有帮助

Posted

技术标签:

【中文标题】例外:在对象 SpreadsheetApp.Range 上获取方法或属性 setNumberFormats 时出现意外错误 - 现有答案对我没有帮助【英文标题】:Exception: Unexpected error while getting the method or property setNumberFormats on object SpreadsheetApp.Range - Existing answer doesn't help me 【发布时间】:2021-02-27 09:23:04 【问题描述】:

我在这里找到了完全相同的问题,但我认为答案对我没有帮助。

我已经好几个星期没有运行这个代码了,它以前没有产生这个错误,但现在它产生了。我没有改变任何东西,我只是去了我制作的数据输入表并尝试使用它。我看不到任何错别字,这是对现有问题的答案。

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"] 中的未定义值。在这个答案中,我想提出以下两种模式。

模式一:

在此模式中,数字格式会被使用 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:

当我看到你的脚本时,似乎使用了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");

注意:

在修改后的脚本之上,使用了电子表格服务。例如,如果你想通过一个调用来实现你的目标,我认为你也可以使用 Sheets API 的 batchUpdate 方法来实现你的目标。如果您需要,请告诉我。

参考:

setNumberFormat(numberFormat) of Class RangeList

【讨论】:

谢谢,这些方法都有效。根据 Google 的执行日志,模式 2 的平均速度比模式 1 略快,这让我感到惊讶,所以可能会坚持下去。我很惊讶这停止工作并且文档没有更改以反映格式数组不能包含空值。 @Martin Bannister 感谢您的回复。很高兴您的问题得到解决。

以上是关于例外:在对象 SpreadsheetApp.Range 上获取方法或属性 setNumberFormats 时出现意外错误 - 现有答案对我没有帮助的主要内容,如果未能解决你的问题,请参考以下文章

Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外

未将对象引用设置到对象的实例如何解决

Swift 5 默认可解码实现,只有一个例外

Ruby 私有实例变量,有例外

javascript 异常处理

jsp内置对象*exception