Google Sheets: delete rows containing specified data

I'm new to Java scripting and Google Apps Scripts so i am sorry if this has already been answered. I was not able to find what i was looking for over the last few months of working on this project.

I am working on a variant of the scripts here:
Delete row in Google Sheets if certain "word" is found in cell
AND
Google Sheet Script - Find Value in Col and Delete Row

I want to create a button, or menu, that will allow someone to enter specific data, and have each row in the spreadsheet containing that data deleted.

I have a test sheet here that illustrates the data i'm working with, formulas i'm using, and has the beginning of the script attached to it: https://docs.google.com/spreadsheets/d/1e2ILQYf8MJD3mrmUeFQyET6lOLYEb-4coDTd52QBWtU/edit?usp=sharing

The first 4 sheets are pulling data from the "Form Responses 1" sheet via a formula in cell A:3 in each sheet so the data would only need to be deleted from the "Form Responses 1" sheet to clear it from the rest of the sheets.

I tried working this in but i do not think i am on the right track. https://developers.google.com/apps-script/guides/dialogs

I also posted this on Google Docs Help Forum 60 days ago, but have not received any responses. Any help would be greatly appreciated.


Solution 1:

There's a few steps. For usability of UI this takes a little longer code. In concise form:

  • The user activates a dialog and enters a string.
  • Rows w/ the string are deleted (with error handling and confirmation)

(Hopefully this gets you started and you can tailor it to your needs)

Function that initiates the menu:

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

The main workhorse:

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   
} 

Isolated UI functions to help make above function more concise:

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