【问题标题】:Google Sheets: delete rows containing specified dataGoogle表格:删除包含指定数据的行
【发布时间】:2017-11-22 11:03:49
【问题描述】:

我是 Java 脚本和 Google Apps 脚本的新手,如果已经回答了这个问题,我很抱歉。在过去几个月从事这个项目的过程中,我找不到我想要的东西。

我正在这里处理脚本的变体:
Delete row in Google Sheets if certain "word" is found in cell

Google Sheet Script - Find Value in Col and Delete Row

我想创建一个按钮或菜单,允许某人输入特定数据,并删除电子表格中包含该数据的每一行。

我在这里有一张测试表,说明了我正在使用的数据、我正在使用的公式,并附有脚本的开头: https://docs.google.com/spreadsheets/d/1e2ILQYf8MJD3mrmUeFQyET6lOLYEb-4coDTd52QBWtU/edit?usp=sharing

前 4 张表格通过每个表格中单元格 A:3 中的公式从“表格回复 1”表格中提取数据,因此只需从“表格回复 1”表格中删除数据即可将其清除其余的床单。

我尝试过这个工作,但我认为我没有走在正确的轨道上。 https://developers.google.com/apps-script/guides/dialogs

我也在 60 天前在 Google 文档帮助论坛上发布了此内容,但没有收到任何回复。 任何帮助将不胜感激。

【问题讨论】:

  • 您要针对数据搜索的单个列还是所有列?
  • 我需要定位所有列,因为要删除的数据可能位于多个不同的列中。

标签: button google-apps-script google-sheets menu


【解决方案1】:

有几个步骤。为了 UI 的可用性,这需要更长的代码。简明扼要:

  • 用户激活一个对话框并输入一个字符串。
  • 带字符串的行被删除(带有错误处理和确认)

(希望这可以帮助您入门,并且可以根据自己的需要进行调整)

启动菜单的函数:

function onOpen(){
  SpreadsheetApp.getUi() 
  .createMenu('My Menu')
  .addItem('Delete Data', 'deleteFunction')
  .addToUi();
}

主力:

function deleteFunction(){
  //declarations
  var sheetName = "Form Responses 1"; 
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName(sheetName);

  var dataRange = sheet.getDataRange();
  var numRows = dataRange.getNumRows();
  var values = dataRange.getValues();

  var delete_string = getUIstring();//open initial UI, save value
  if (delete_string.length < 3) return shortStringError()//UI to protect your document from an accidental entry of a very short string. 

  //removing the rows (start with i=2, so don't delete header row.) 
  var rowsDeleted = 0;
  for (var i = 2; i <= numRows; i++){
    var rowValues = values[i-1].toString();//your sheet has various data types, script can be improved here to allow deleting dates, ect. 

    if (rowValues.indexOf(delete_string) > -1){
      sheet.deleteRow(i - rowsDeleted);//keeps loop and sheet in sync
      rowsDeleted++; 
    }

  }
  postUIconfirm(rowsDeleted);//Open confirmation UI   
} 

独立的 UI 功能,有助于使上述功能更简洁:

function getUIstring(){
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt("Enter the target data element for deletion")
  return response.getResponseText()
}

function postUIconfirm(rowsDeleted){
  var ui = SpreadsheetApp.getUi();
  ui.alert("Operation complete. There were "+rowsDeleted+" rows deleted.")  
}

function shortStringError(){
  var ui = SpreadsheetApp.getUi();
  ui.alert("The string is too short. Enter a longer string to prevent unexpected deletion")  
}

【讨论】:

  • 非常感谢!我没想到有人会写整件事。这绝对是完美的。我对其进行了一些测试,并且运行良好。看起来它甚至解决了我担心删除数据并留下空白行的问题(这会导致电子表格变得太大而无法处理当前编写的公式);整行被删除。我真的很感激这一点。你为我节省了无数小时的工作时间。而且你以我可以遵循的方式对其进行了分解,所以我从中学到的东西比我预期的要多。
  • 我认为它会帮助您入门。我认为一旦你知道与电子表格交互的正确方法,调用 UI 接口等,GAS 真的很容易。在此过程中,我看到了一些如何实施多步骤 dea 的具体示例对我很有帮助,而不是在刚开始时努力寻找方法。
【解决方案2】:

如果单元格值符合您的搜索条件,我将展示一种删除单元格值的方法。将其连接到按钮等由您决定。

您将循环访问Sheet Range。当你找到匹配的单词时,使用clearContent()删除它

函数 deleteSpecificData() {

 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[0];
 var range = sheet.getRange("Sheet1!A1:C4");
 var values = range.getValues();
 var numArray = [1,2,3,4,5,6,7,8,9];

 var deleteItem = "Garen";

 Logger.log(range);

  for(var i=0; i< values.length; i++){
    for(var j=0; j<values[i].length; j++){
      if(values[i][j] == deleteItem){
           var row = numArray[i];
           var col = numArray[j];
           var range = sheet.getRange(row,col).clearContent();

      }
    }
  }

}

之前:

之后:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2010-11-19
    • 2023-01-27
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多