1

上下文 我们有从其他地方导出的数据,我们需要定期自动处理这些数据,但我们无法控制它是如何导出的,而且它以一种难看且难以使用的方式出现。所以我们自动化了一个脚本,它只从第一个电子表格(oldWorksheet)中获取我们需要的内容,并将其放入一个新的电子表格(newWorksheet)中

我们有工作代码,因为它是在我们手动执行操作时自动生成的,但我们想尝试减少一些迭代循环所需的重复代码行。伪代码看起来很有希望,但我们现在意识到我们不确定如何以我们想要的方式增加其中一些变量。


问题 我们希望相关变量在每次循环时按字母顺序增加预定数量的字符。我们将如何做这件事?

var i:number = 0;
var x:string = "B";
var y:string = "D";

while (i < 100)
{
    newWorksheet.getRange(x:x).copyFrom(oldWorksheet.getRange(y:y), ExcelScript.RangeCopyType.all, false, false);
    // increment x by 1 (A -> B -> C etc.)
    // increment y by 2 (A -> C -> E etc.)
    i++;
}

变量 x 和 y 与 Excel 电子表格的行/列有关,它们将经过 Z 并继续朝向 AA、AB、AC 等。

这可以在同一个过程中完成吗?或者我们是否必须跟踪它已经走了多远,然后在脚本读取它的同时将两个变量连接在一起?即,效果如下:

while (i < 100)
{
    z = columnTracker + x    
    // z = A + D (= AD)
    newWorksheet.getRange(z:z)...

提前致谢!

4

1 回答 1

2

我相信这段代码可以满足您的要求。请看下面:

function main(workbook: ExcelScript.Workbook) {
    let i: number = 0;
    let counter: number = 0;

    let oldWorksheet : ExcelScript.Worksheet = workbook.getWorksheet("oldWorksheet");
    let newWorksheet: ExcelScript.Worksheet = workbook.getWorksheet("newWorksheet");

    while (i < 100 ){
        let oldRange: ExcelScript.Range = oldWorksheet.getCell(0,counter).getEntireColumn();
        let newRange: ExcelScript.Range = newWorksheet.getCell(0,i).getEntireColumn();
        newRange.copyFrom(oldRange);
        // increment x by 1 (A -> B -> C etc.)
        // increment y by 2 (A -> C -> E etc.)
        i++;
        counter += 2;
    }
}

在循环中,此代码将带有 getCell() 的 counter 变量用于旧范围,将带有 getCell() 的 i 变量用于新范围。一旦我们有了单元格,我们就可以使用 getEntireColumn() 来获取整个列的范围。将旧工作表的范围复制到新工作表后,计数器变量增加 2,然后进入循环的下一次迭代。

虽然此代码有效,但它可能会很慢,因为您要进行大量复制和粘贴。如果您的数据已标准化,您可能可以使用数组。如果您遍历旧工作表中的值数组,创建一个新数组,然后使用 SetValues 将新数组写入新工作表,则生成的操作应该快得多。该代码可能如下所示:

function main(workbook: ExcelScript.Workbook) {
  let i: number = 0;
  let increm: number = 2;

  let oldWorksheet: ExcelScript.Worksheet = workbook.getWorksheet("oldWorksheet");
  let newWorksheet: ExcelScript.Worksheet = workbook.getWorksheet("newWorksheet");
  let oldRange: ExcelScript.Range = oldWorksheet.getRange("A1").getSurroundingRegion();
  let oldRowCount: number = oldRange.getRowCount();
  let oldColCount: number = oldRange.getColumnCount();
  let oldRangeVals: (string | number | boolean)[][] = oldRange.getValues();
  let newRangeVals: (string | number | boolean)[][] = [];
  let columnCounter: number = oldColCount / increm;

  for (let i = 0; i < oldRowCount; i++) {
    let tempVals: (string | number | boolean)[] = [];
    for (let j = 0; j < oldColCount; j+=increm){
      tempVals.push(oldRangeVals[i][j]);
    }
    newRangeVals.push(tempVals);
  }
  let newRange: ExcelScript.Range = newWorksheet.getRange("A1").getResizedRange(oldRowCount - 1, columnCounter - 1);
  newRange.setValues(newRangeVals);
}

此代码获取旧工作表当前区域中当前行和列的计数。它还获取旧工作表当前区域中单元格的值。它使用请求的参数遍历数组。然后将结果值写入新数组。循环完成后,新工作表中的范围将调整为新数组的大小。完成后,使用 setValues 将新数组写入新工作表。

于 2021-09-30T18:30:51.910 回答