【问题标题】:How to add a button per row in google spreadsheet?如何在谷歌电子表格中每行添加一个按钮?
【发布时间】:2025-11-28 06:55:02
【问题描述】:

我有一个包含多行的简单电子表格,我想自动为每一行添加按钮。

单击此按钮将删除整行并将其移至另一个电子表格。

我上网查了一下,找不到向电子表格添加按钮的方法。有人建议插入图纸并分配宏,但看起来最新版本缺少此功能。

我还阅读了有关 google app sript 的信息。我能够将按钮添加到菜单,但不能直接添加到电子表格的每一行。

您对如何更好地实现这一目标有任何建议或建议吗?

【问题讨论】:

  • 我的建议是使用一列作为菜单脚本将其复制到另一个电子表格的条件。
  • @Jacobvdb,感谢您的建议。如果这样做,如何捕获单元格编辑事件?
  • 好吧,你不这样做,而是首先用特定条件标记某一列中的所有行,然后使用通过菜单激活的脚本,你将复制所有行条件到另一个电子表格。 manual for menus
  • 您不能在电子表格单元格中插入按钮。使用上面建议的“标记”,并将该标记用作从菜单调用的脚本的条件。

标签: google-apps-script google-sheets google-drive-api spreadsheet google-apps


【解决方案1】:

我建议您在每行的末尾创建一个列(比如 10),并使用“移动行”的列表数据验证,并像这样创建一个 onEdit 函数

function onEdit(eventInfo) {
  if (eventInfo.range.getColumn() == 10 && eventInfo.value == "Move Row")
  {
    var ss = eventInfo.source;
    var row = eventInfo.range.getRow();
    var range = ss.getRange(row, 1, 10) // this is your range, do with it what you will
  }

}

【讨论】:

    【解决方案2】:

    所以这个脚本并不完全是我自己的作品,而是我在帮助下工作的结果。

    它将在源表中查找,查看您指定的列(按编号),并在此表中查找值。

    如果匹配,它将将该行移动到您选择的电子表格中的另一张工作表中。

        function moveRowInternalSheet()
    {
    
      var sourceSheet = ""; 
      var columnNumberToWatch = ;
      var valueToFind = "";
      var destinationSheet = "";
    
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName(sourceSheet);
    
      var values = sheet.getDataRange().getValues();
      var counter = 1; //starts looking in second row, due to header
      var archive = [];
    
    
    
      while (counter < values.length)
      {
    
    
        if (values[counter][columnNumberToWatch - 1] == valueToFind)
        {
    
    
          archive.push(values.splice(counter, 1)[0]); 
        }
        else
        {
        // If the value to find is not found. Then increment the counter by 1
    
          counter++;
        }
      }
    
    
    
    
    
      var archiveLength = archive.length;
    
    
    
    
      if (!archiveLength) return; 
    
    
    
      var targetSheet = ss.getSheetByName(destinationSheet);
    
    
      var lastRow = targetSheet.getLastRow();
    
    
    
      var requiredRows = lastRow + archiveLength - targetSheet.getMaxRows();
    
    
    
      if (requiredRows > 0) targetSheet.insertRowsAfter(lastRow, requiredRows);
    
    
    
      targetSheet.getRange(lastRow + 1, 1, archiveLength, archive[0].length).setValues(archive);
    
    
      sheet.clearContents();
    
    
      sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
    }
    

    【讨论】: