是否可以在 office 脚本中将数据从一个 sheet 复制、粘贴和删除到另一个?

Is it possible to copy, paste, and delete data from one sheet to another in office scripts?

我在 SharePoint 上保存了一个记录测试的文档。

测试完成后,我想将测试(整行)移动到单独的 sheet 以存档测试计划,在下一个空行中,并且因为它现在已存档将其删除来自提交 sheet.

两个 sheet 都在同一个工作簿中。每次脚本 运行 时行数都不同,因此脚本代码需要根据用户的选择输入来工作(在 运行 脚本之前或由脚本提示)。

我在 VBA 中做到了这一点。我找不到替代选择功能的可行方法。有什么方法可以将下面的 VBA 代码转换为 Office 脚本,以便在 Excel 在线中发生同样的事情吗?

Sub MoveCompletedTests()

     Selection.Copy Sheets("Archive - ATL staff only").Range("A1048576").End(xlUp).Offset(1, 0)

     Selection.Delete

End Sub

我在“示例提交”sheet 上有一个按钮,运行 将上面的代码放在所选范围内 sheet 将其移动到“存档 - ATL 人员”只有” sheet.

我尝试使用脚本记录器,但脚本不允许选择足够动态,它针对单元格范围进行编码,而不仅仅是选择。

我认为像 getSelectedRange 这样的东西应该可以工作(至少,如果你不是同时处理多个选定的范围):

    function main(workbook: ExcelScript.Workbook)
    {
      let destination: ExcelScript.Range;
      let source = workbook.getSelectedRange().getEntireRow();
      let archive = workbook.getWorksheet("Archive - ATL staff only");
      if(archive.getUsedRange() == undefined) {
        // if the archive sheet is empty, use the first row as a destination
        destination = archive.getRange("1:1");
      }
      else {
        // ... otherwise, use the next row after the last used
        destination = archive.getUsedRange().getRowsBelow().getEntireRow();
      }
      destination.copyFrom(source, ExcelScript.RangeCopyType.values);
      source.delete(ExcelScript.DeleteShiftDirection.up);
    }

p.s。需要明确的是,在 VBA 的情况下,选择是一个 property of Application. But in case of ExcelScript it's a method of a Workbook object. This can be a bit confusing because there is an ExcelScript.Application 接口,其中没有提及选择。

您可以在此处尝试代码:

function main(workbook: ExcelScript.Workbook) {
    //Assign the source variable to the selected range
    let source: ExcelScript.Range = workbook.getSelectedRange()

    //Assign the archive variable to the Archive worksheet
    let archive: ExcelScript.Worksheet = workbook.getWorksheet("Archive - ATL staff only");

    //Set the destination range in the archive sheet
    let destination: ExcelScript.Range = archive.getRange("A:A").getExtendedRange(ExcelScript.KeyboardDirection.up).getLastCell().getOffsetRange(1,0)

    //Determine if the offset range is set to A2 in the Archive sheet.
    //If so, determine if A1 has a value. If it does not, update the
    //destination range to cell A1.

    if (destination.getAddress() === "'Archive - ATL staff only'!A2" ){
      if (destination.getOffsetRange(-1,0).getValue() === "") {
        destination = destination.getOffsetRange(-1,0)
      }
    }

    //Copy the selected source range to the destination range
    destination.copyFrom(source, ExcelScript.RangeCopyType.all);

    //Delete the data in the source range
    source.delete(ExcelScript.DeleteShiftDirection.up);
  }

此代码根据存档 sheet 中 A 列中的数据确定最后一个单元格。如果存档 sheet 的使用范围在某处有数据,但 A 列没有,这将很有用。在这种情况下,此代码仍会正确更新。

此外,此代码不会复制和删除整行。因此,如果您打算使用小于整行的选择,此代码可能会更好。