0

我每天都在使用 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 秒内完成,没有任何问题。为什么这会影响重新计算关闭的速度?

4

2 回答 2

0

从进一步的测试看来,即使将计算设置为手动,任何包含公式的表在使用时都会导致速度变慢table.addRows(),并且 Graph API 或 PowerAutomate 连接器无法等待足够长的时间来获得响应。

我发现的唯一解决方案是最小化或消除那些

  • 正在添加到的表中
  • 引用要添加到的表

当我将问题表中的公式作为值粘贴并重新尝试添加行时,它第一次工作,没有对其他任何内容进行任何更改。

在我的情况下,我需要直接在我的表中计算列,所以我会定期用值替换脚本添加的公式。这可以手动完成,也可以通过range.setFormulas(range.getValues())在您指定的范围上使用脚本来完成(我建议将此范围限制在您需要的范围内,因为即使在浏览器中它在超时之前也只完成了大约 1000 行,所以您不应该使用它在整个桌子上)。

于 2021-04-20T09:06:40.220 回答
0

这可能是由于在向表中添加新行时表运行自动重新计算而发生的。对大小合适的表执行此操作时,图形可能会超时。我们可以通过将计算选项设置为手动来将重新计算操作与表操作分离,然后在表操作完成后返回自动以启动重新计算。

// 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-15T21:15:29.127 回答