首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Excel脚本从Power自动运行失败,错误为504

Excel脚本从Power自动运行失败,错误为504
EN

Stack Overflow用户
提问于 2021-04-15 10:26:43
回答 2查看 2K关注 0票数 0

我每天使用PowerAutomate将数据添加到报表中。数据以CSV附件的形式出现在电子邮件中,用Azure函数解析为2D数组,并将数据串成JSON,然后传递给excel脚本,该脚本解析JSON,将行数组截断到正确的宽度,将公式添加到计算列的行数组,并使用table.addRows()函数将数据添加到表中。

这发生在来自三个不同报告的三个不同的表上(间隔30分钟)。

PowerAutomate.

  • The
  • 1很小,每天增加~10行,没有添加公式列,这在中总是很好的,成功的是每天大约150行,加上一个添加的公式列。这总是成功地添加数据,但有时PowerAutomate连接器在504 BadGateway中失败--对Graph的请求已经超时。
    • 第三个是每天大约150行,并添加了一些公式列。这通常会失败,要么成功地添加日期但返回上面的错误,要么无法添加数据并返回我们无法运行脚本。请再试一次。Office错误:第44行:表addRows:请求失败,状态代码为504,错误代码为UnknownError

下面是函数本身(特别是第三个例子):

代码语言:javascript
运行
复制
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

  • removed

  • ),尽可能少地访问工作簿(对.getFormulas()的调用),并硬编码数组instead

  • changed ( PowerAutomate超时值到P1D ),然后重试none(

  • ),将工作簿/set计算模式的重新计算关闭为手动(无论是在工作簿级别还是脚本本身的开头)

如果我将JSON粘贴到函数中并在浏览器中运行,这将100%起作用。我无法确定这是否是由于实际的函数超时、PowerAutomate未能等待足够长的时间等待结果、图形API中的一些超时或其他原因造成的。

工作簿的大小小于5mb,失败的表通常有大约13.000行。

编辑:

我要添加到的工作簿中有这三个表的工作表,另外还有一些分析表。我还测试了删除不同的工作表、引用等。减速似乎是表中已经存在的公式列,因为只有完全删除这些列,才能在每个实例中成功地实现函数。现在,它不是在90秒内超时,而是在8秒内完成,没有任何问题。为什么这会影响重新计算关闭的速度?

EN

回答 2

Stack Overflow用户

发布于 2021-04-15 21:15:29

这可能是由于在向表中添加新行时运行自动重新计算的表所致。对于大小相当大的表,图可以在执行此操作时超时。通过将计算选项设置为手动,可以将recalc操作与表操作分离,然后在表操作完成后返回到Automatic,以启动recalc。

代码语言:javascript
运行
复制
// 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);   
票数 0
EN

Stack Overflow用户

发布于 2021-04-20 09:06:40

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

我找到的唯一解决办法是最小化或消除以下公式

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

的表

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67106737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档