在 Office 脚本中在线增加 Excel 的字母表计数器

Incrementing Alphabet Counter for Excel Online in Office Script

上下文 我们有从其他地方导出的数据,我们需要定期自动处理这些数据,但我们无法控制它的导出方式,而且它以难看且难以使用的方式输出。 所以我们自动化了一个脚本,它只从第一个电子表格 (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 电子表格的 rows/columns 有关,它们将经过 Z 并继续朝向 AA、AB、AC 等。

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

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

提前致谢!

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

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() 用于旧范围,将 i 变量与 getCell() 用于新范围。一旦我们有了单元格,我们就可以使用 getEntireColumn() 来获取整个列的范围。将旧sheet的范围复制到新sheet后,计数器变量加2,进入下一次循环。

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

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);
}

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

将新数组写入新的 sheet