我每天使用PowerAutomate将数据添加到报表中。数据以CSV附件的形式出现在电子邮件中,用Azure函数解析为2D数组,并将数据串成JSON,然后传递给excel脚本,该脚本解析JSON,将行数组截断到正确的宽度,将公式添加到计算列的行数组,并使用table.addRows()函数将数据添加到表中。
这发生在来自三个不同报告的三个不同的表上(间隔30分钟)。
PowerAutomate.
下面是函数本身(特别是第三个例子):
function main(workbook: ExcelScript.Workbook, inputData: string) {
// Get formula columns as array of strings
const additionalData = workbook.getWorksheet(`contact_time`).getRange("W2:AG2").getFormulas()[0]
// Parse inputData to get actual array
const dataToAdd: Array<Array<string>> = JSON.parse(inputData)
// Remove first row's data as is just headers
dataToAdd.shift()
if (dataToAdd.length == 0) {
return
}
// Truncate each input array row and add formula array columns on to the end
for (const row of dataToAdd) {
row.length = 22
for (const column of additionalData) {
row.push(column)
}
}
// Add data to table
workbook.getTable("t").addRows(null, dataToAdd)
}为了使这件事变得更好
脚本中的工作簿( requests
.getFormulas()的调用),并硬编码数组instead
如果我将JSON粘贴到函数中并在浏览器中运行,这将100%起作用。我无法确定这是否是由于实际的函数超时、PowerAutomate未能等待足够长的时间等待结果、图形API中的一些超时或其他原因造成的。
工作簿的大小小于5mb,失败的表通常有大约13.000行。
编辑:
我要添加到的工作簿中有这三个表的工作表,另外还有一些分析表。我还测试了删除不同的工作表、引用等。减速似乎是表中已经存在的公式列,因为只有完全删除这些列,才能在每个实例中成功地实现函数。现在,它不是在90秒内超时,而是在8秒内完成,没有任何问题。为什么这会影响重新计算关闭的速度?
发布于 2021-04-15 21:15:29
这可能是由于在向表中添加新行时运行自动重新计算的表所致。对于大小相当大的表,图可以在执行此操作时超时。通过将计算选项设置为手动,可以将recalc操作与表操作分离,然后在表操作完成后返回到Automatic,以启动recalc。
// At the beginning of the script right after main() function,
...
// Set calculation mode to manual
workbook.getApplication().setCalculationMode(ExcelScript.CalculationMode.manual);
// do your processing...
// Set calculation mode back to automatic
workbook.getApplication().setCalculationMode(ExcelScript.CalculationMode.automatic); 发布于 2021-04-20 09:06:40
从进一步的测试来看,即使将计算设置为手动,任何包含公式的表在使用table.addRows()时都会导致缓慢,并且Graph或PowerAutomate连接器都无法等待足够长的响应时间。
我找到的唯一解决办法是最小化或消除以下公式
的表
当我将问题表中的公式粘贴为值并重新尝试添加行时,它第一次工作时没有对任何其他内容进行任何更改。
在我的例子中,我直接需要表中的计算列,所以我定期用值替换脚本添加的公式。这可以手动完成,也可以通过在您指定的范围上使用range.setFormulas(range.getValues())来完成(我建议将这个范围限制在您需要的范围内,因为即使在浏览器中,它在超时之前也只完成了大约1000行,所以不应该在整个表上使用它)。
https://stackoverflow.com/questions/67106737
复制相似问题