You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将Excel VBA行移动代码转换为Google Sheets脚本

需求:将Excel VBA功能转换为Google Apps Script
  • 背景:刚使用Google Sheets,不熟悉Google Apps Script(此前误认成Java)。之前在Excel中用VBA实现功能:把选中区域内第4列值为“Done”的行复制到“Done”工作表,再删除原行。现在需要转成Google Sheets可用的脚本,试过免费转换工具、搜代码、自行编写均失败,因工作繁忙没时间学习相关技术,寻求帮助。

原Excel VBA代码

Sub button()
    For Each myCell In Selection.Columns(4).Cells
        If myCell.Value = "Done" Then
            myCell.EntireRow.Copy Worksheets("Done").Range("A" & Rows.Count).End(3)(2)
            myCell.EntireRow.Delete
        End If
    Next
End Sub

本人尝试的无效代码

第一段:

function Button(d) {
      var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      var DoneSheet = activeSpreadsheet.getSheetByName('Done');
      var activeSheet = SpreadsheetApp.getActiveSheet();
      var numColumns = activeSheet.getLastColumn();
      var cell = d.range;
      var value = activeSheet.getLastColumn.value;
      var lock = LockService.getScriptLock();

           if (activeSheet.getSheetName() == 'Dev Jobs' && activeSheet.getLastColumn.value == 'Done') {

        lock.tryLock(10000);

        if (!lock.hasLock()) {

          activeSpreadsheet.toast('The Spreadsheet is busy currently, please try again in a bit.');

        } else {
     
      var row = activeSheet.getRange(cell.getRow(), 1, 1, numColumns).getValues();

      DoneSheet.appendRow(row[0]);

      activeSheet.deleteRow(cell.getRow());

        }
    }
}

第二段:

if (activeSheet.getSheetName() == 'Dev Jobs' && activeSheet.getLastColumn.value == 'Done') {

    lock.tryLock(10000);

   if (!lock.hasLock()) {

      activeSpreadsheet.toast('The Spreadsheet is busy currently, please try again in a bit.');

   } else {

 var row = activeSheet.getRange(cell.getRow(), 1, 1, numColumns).getValues();

  DoneSheet.appendRow(row[0]);

  activeSheet.deleteRow(cell.getRow());

    }
  }
}

解决方案:正确的Google Apps Script代码

function moveDoneRows() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const activeSheet = ss.getActiveSheet();
  const doneSheet = ss.getSheetByName('Done');
  
  // 检查Done工作表是否存在
  if (!doneSheet) {
    SpreadsheetApp.getUi().alert('未找到名为"Done"的工作表,请先创建');
    return;
  }
  
  // 检查是否有选中区域
  const selection = activeSheet.getSelection();
  if (!selection) {
    SpreadsheetApp.getUi().alert('请先选中要处理的区域');
    return;
  }
  
  const range = selection.getActiveRange();
  const startRow = range.getRow();
  const endRow = range.getLastRow();
  const numCols = activeSheet.getLastColumn();
  
  // 倒序遍历,避免删除行后索引混乱
  for (let i = endRow; i >= startRow; i--) {
    const statusCell = activeSheet.getRange(i, 4);
    const status = statusCell.getValue();
    
    if (status === 'Done') {
      const rowValues = activeSheet.getRange(i, 1, 1, numCols).getValues()[0];
      // 复制到Done表的最后一行下方
      doneSheet.appendRow(rowValues);
      // 删除原行
      activeSheet.deleteRow(i);
    }
  }
}

使用说明

  1. 打开目标Google Sheets,点击「扩展程序」→「Apps Script」
  2. 粘贴上述代码,保存项目(自定义命名即可)
  3. 返回表格,选中需要处理的区域(需包含第4列)
  4. 点击「扩展程序」→ 找到你保存的脚本项目 → 运行moveDoneRows函数
  5. 首次运行需授权,按照提示完成操作即可

内容的提问来源于stack exchange,提问作者Corevalence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:14:55