我每天都在使用 PowerAutomate 将数据添加到报告中。数据以 CSV 附件的形式通过电子邮件传入,使用 Azure 函数将其解析为 2D 数组并字符串化为 JSON,然后将其传递给解析 JSON 的 excel 脚本,将行数组截断为正确的宽度,添加公式到计算列的行数组,并使用table.addRows()
函数将数据添加到表中。
这发生在来自三个不同报告的三个不同表格上(相隔 30 分钟)。
- 一个很小,每天添加约 10 行,没有添加公式列,这在 PowerAutomate 中总是很好并且很成功。
- 第二个是每天约 150 行,添加一个公式列。这总是会成功添加数据,但有时 PowerAutomate 连接器会失败,并显示504 BadGateway - Request to Graph API has timed out。
- 第三个是每天约 150 行,并添加了一些公式列。这通常会失败,要么成功添加日期但返回上述错误,要么添加数据失败并返回我们无法运行脚本。请再试一次。Office JS 错误:第 44 行:表 addRows:请求失败,状态代码为 504,错误代码 UnknownError
这是函数本身(特别是第三个示例):
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)
}
为了尝试优化这一点,我有
- 在脚本中,以尽可能少的请求访问工作簿的最少次数
.getFormulas()
删除了对数组的调用并对其进行硬编码- 将 PowerAutomate 超时更改为 P1D 并重试为无
- 关闭工作簿的重新计算/将计算模式设置为手动(在工作簿级别和脚本本身的开头)
如果我将 JSON 粘贴到函数中并在浏览器中运行它,这 100% 的时间都有效。我无法确定这是由于实际函数超时、PowerAutomate 未能等待足够长的时间以获得结果、Graph API 中的一些超时或其他原因。
工作簿的大小低于 5mb,最常失败的表通常有大约 13.000 行。
编辑:
我要添加的工作簿有这三个表的工作表,还有一些带有分析表的工作表。我还测试了删除不同的工作表、引用等。减速似乎是表中已经存在的公式列,因为只有完全删除这些列才能使函数在每个实例中都成功。现在不是在 90 秒内超时,而是在 8 秒内完成,没有任何问题。为什么这会影响重新计算关闭的速度?