0

我在浏览器中使用 Excel Online,已从源设置了指向我的主文件的工作簿链接。在我的主文件中,我有表格标题和带有公式的附加列。我只需要从 A2 到 AC 下来。问题是源文件每天都在变化。第二天可能会有更多行或更少。我需要能够引用设置列,然后检测数据源中有多少行并更新主文件

到目前为止,我有这样的事情

='https://sharepoint.com/personal/myFolder/Documents/[data_source.xlsx]in'!A2

在 B2 和 C2 列上加载第一行。我可以从源数据中选择一个范围,以便加载所有数据,但如果第二天有更多行,它不会加载那些,或者如果有更少,它将显示为空白。

如何告诉公式选择列 A2 到 C2 并向下扩展,或者在使用数据连接时像在 Excel 桌面中那样刷新数据?

在此处输入图像描述

正如您所看到的源数据,第 2 天有额外的行不会加载到我的主文件中。

4

1 回答 1

2

您可以使用 PowerAutomate 和两个 Office 脚本将两个工作簿链接在一起。

您将从使用重复开始。因此,您可以选择希望流程运行的频率(每周、每天等)

PowerAutomate - 重复步骤

设置重复周期后,您必须编写一个处理表数据的办公脚本。您可以使用表的 GetRangeBetweenHeaderAndTotal() 方法来处理表的 dataBodyRange。一旦你有了它,你就可以调整范围的大小来获得你需要的数据。接下来,您需要获取可用于 GetValues 方法的值。GetValues 返回一个无法从 PowerAutomate RunScript 返回的二维数组。因为你不能这样做,但你可以返回一个字符串,你可以通过将二维数组转换为 json 字符串来解决这个问题。你可以看到下面的代码:

function main(workbook: ExcelScript.Workbook): string {
  let sh: ExcelScript.Worksheet = workbook.getActiveWorksheet();
  //get table
  let tbl: ExcelScript.Table = sh.getTable("Table1");
  //get table's column count
  let tblColumnCount: number = tbl.getColumns().length;
  //set number of columns to keep
  let columnsToKeep: number = 3;
  //set the number of rows to remove
  let rowsToRemove: number = 0;
  //resize the table range
  let tblRange: ExcelScript.Range = tbl.getRangeBetweenHeaderAndTotal().getResizedRange(rowsToRemove,columnsToKeep - tblColumnCount);
  //get the table values
  let tblRangeValues: string[][] = tblRange.getValues() as string[][];
  //create a JSON string
  let result: string = JSON.stringify(tblRangeValues);
  //return JSON string
  return result;
}

创建脚本后,请考虑将其命名为您在 PowerAutomate 中调用它时会记住的名称(我将其命名为 getTableValues)。接下来,在 PowerAutomate 中重复之后,添加一个运行脚本步骤。填写值并选择脚本,如下所示:

PowerAutomate - 运行脚本步骤

接下来,您必须创建一个脚本,该脚本接受从前一个脚本返回的输入并完成最后的步骤。所以脚本必须有一个参数,该参数接受从前一个脚本返回的字符串(我在我的脚本中称之为 tableValues)。在脚本中,您必须解析 json 字符串数组以创建二维数组,调整初始范围的大小,然后设置调整后的范围的值。您可以在下面看到执行此操作的脚本:

function main(workbook: ExcelScript.Workbook, tableValues: string)
{
  let sh: ExcelScript.Worksheet = workbook.getWorksheet("Sheet1")
  //parses the JSON string to create array
  let tableValuesArray: string[][] = JSON.parse(tableValues);
  //gets row count from the array
  let valuesRowCount: number = tableValuesArray.length - 1
  //gets column count from the array
  let valuesColumnCount: number = tableValuesArray[0].length - 1
  //resizes the range
  let rang: ExcelScript.Range = sh.getRange("A1").getResizedRange(valuesRowCount,valuesColumnCount)
  //sets the value of the resized range to the array
  rang.setValues(tableValuesArray)
}

在 PowerAutomate 中,您必须创建第二个运行脚本步骤。第二步,在你选择脚本后应该会提示你输入一个值(在我的步骤中该值称为tableValues。)在表值输入中,你必须输入动态内容结果值。完成后,您可以保存脚本并进行测试。

PowerAutomate - RunScript2 步骤

需要注意的一点是,第二个脚本不会从以前的运行中删除旧的范围值。这可以通过多种不同的方式来完成。但首选方式可能取决于工作簿的结构。所以我建议在开始的某个地方编写代码来清除第二个脚本中的范围。或者更好的是,将第一个脚本的输出添加到 Excel 表中。每次运行第二个脚本时只需清空表格。

于 2021-12-26T18:05:13.890 回答