Удаление строк после даты, прошедшей автоматически для электронных таблиц Google [дубликат]

У меня была эта проблема, и я использовал эту технику .

Это лучшее решение, которое я нашел очень гибким.

Также, пожалуйста, проголосуйте здесь , чтобы добавить поддержку декларации кумулятивного раздела

16
задан Rubén 20 September 2016 в 00:16
поделиться

9 ответов

У меня было несколько проблем со сценариями, поэтому моим обходным путем было использование инструмента «Фильтр».

  1. Выбрать все данные электронных таблиц
  2. Нажмите значок инструмента фильтра (выглядит например, бокал)
  3. Щелкните значок нового фильтра в первой ячейке столбца, который вы хотите найти.
  4. Выберите «Фильтр по условию»> Задайте условия (я использовал «Текст содержит»> «слово»)

Это оставит строки, содержащие слово, которое вы ищете, и их можно удалить, выбрав их массой, удерживая клавишу shift> щелкните правой кнопкой мыши> удалить строки.

4
ответ дан Adam 17 August 2018 в 17:39
поделиться
function onEdit(e) {
  //Logger.log(JSON.stringify(e)); 
  //{"source":{},"range":{"rowStart":1,"rowEnd":1,"columnEnd":1,"columnStart":1},"value":"1","user":{"email":"","nickname":""},"authMode":{}}
  try {
    var ss = e.source; // Just pull the spreadsheet object from the one already being passed to onEdit
    var s = ss.getActiveSheet();

    // Conditions are by sheet and a single cell in a certain column
    if (s.getName() == 'Sheet1' &&  // change to your own 
        e.range.columnStart == 3 && e.range.columnEnd == 3 &&  // only look at edits happening in col C which is 3
        e.range.rowStart == e.range.rowEnd ) {  // only look at single row edits which will equal a single cell
      checkCellValue(e); 
    }
  } catch (error) { Logger.log(error); }
};

function checkCellValue(e) {
  if ( !e.value || e.value == 0) {  // Delete if value is zero or empty
    e.source.getActiveSheet().deleteRow(e.range.rowStart);
  }
}

Это только просмотр значения из одного изменения ячейки теперь, а не значений всего листа.

19
ответ дан Bryan P 17 August 2018 в 17:39
поделиться
  • 1
    Я никогда не использую этот «ярлык». синтаксис, вот почему я спрашивал ... но мой вопрос был глупым, я на самом деле не видел, что вы использовали values, мой мозг перевел его как values.length ... Думаю, я, должно быть, слишком устал иногда ;-); В любом случае, спасибо за ответ, я не знаю ни того, что лучше всего подходит ... Думаю, это более или менее вопрос личных предпочтений! – Serge insas 16 November 2012 в 18:59
  • 2
    Я взял это и изменил onEdit() на произвольное имя функции, потому что я хочу запустить его на данных, которые уже есть, а не во время редактирования, но имеет странное поведение: когда я выбираю его из диспетчера скриптов и запускаю его, он удаляет строку one и останавливается, тогда я должен запустить ее снова. Отключается ли цикл при изменении количества существующих строк? – hsribei 18 November 2012 в 23:28
  • 3
    @BryanP не было бы легче повторять назад? for( var row = values.length -1; row >= 0; --row ) – Henrique G. Abreu 20 November 2012 в 02:01
  • 4
    Да, BrianP, вам не нужна дополнительная коррекция delete, если вы повторяете назад. Ну, может быть, это проще в моей голове :) – Henrique G. Abreu 20 November 2012 в 17:22
  • 5
    @BryanP вам следует избегать циклов for-in в Javascript, потому что он выполняет итерации по всем свойствам, а не только тем, которые вы ему назначили. Вот статья, в которой говорится об этом: yuiblog.com/blog/2006/09/26/for-in-intrigue – Weehooey 21 November 2012 в 13:37

Существует более простой способ:

  1. Использовать фильтрацию , чтобы отображать только строки, которые вы хотите удалить. Например, мой столбец, на основе которого я хочу удалить строки, имел на них категории, A, B, C. Через интерфейс фильтрации я выбрал только A и B, которые я хотел удалить.
  2. Выбрать все строк и удалить их. Выполнение этого, в моем примере, эффективно выбрало все строки A и B и удалило их; теперь моя таблица не показывает никаких строк.
  3. Отключите фильтр. Это отображает мои строки C. Сделано!
0
ответ дан Dominykas Mostauskis 17 August 2018 в 17:39
поделиться
  • 1
    Это нужно сделать по сценарию – Serge insas 29 April 2015 в 15:28
  • 2
    @Serge Меня обманули небольшим различием вопроса в названии и теле. Предлагает редактировать. – Dominykas Mostauskis 29 April 2015 в 19:36

внимательно прочитав ваш вопрос, я придумал это решение:

function onOpen() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // create menu
  var menu = [{name: "Evaluate Column C", functionName: "deleteRow"}];

  // add to menu
  ss.addMenu("Check", menu);
}

function deleteRow() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get active/selected row
  var activeRow = ss.getActiveRange().getRowIndex();

  // get content column C
  var columnC = ss.getRange("C"+activeRow).getValue();

  // evaluate whether content is blank or 0 (null)
  if (columnC == '' || columnC == 0) {
    ss.deleteRow(parseInt(activeRow));
  }
}

Этот скрипт создаст меню при загрузке файла и позволит вам удалить строку на основе тех критериев, которые установлены в столбце C, или нет.

0
ответ дан Jacob Jan Tuinstra 17 August 2018 в 17:39
поделиться
  • 1
    Интересно, хотел ли Зак полностью автоматизировать его полный лист или хотел бы сам решить? – Jacob Jan Tuinstra 21 November 2012 в 19:03

Я написал этот скрипт, чтобы сделать то же самое для одной из моих электронных таблиц Google. Я хотел иметь возможность запускать скрипт после того, как все данные были в электронной таблице, поэтому у меня есть сценарий, добавляющий параметр меню для запуска скрипта.

/**
 * Deletes rows in the active spreadsheet that contain 0 or
 * a blank valuein column "C". 
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function readRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (row[2] == 0 || row[2] == '') {
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Remove rows where column C is 0 or blank",
    functionName : "readRows"
  }];
  sheet.addMenu("Script Center Menu", entries);
};

Проверить таблицу перед:

enter image description here [/g3]

Запуск скрипта из меню:

enter image description here [/g4]

После запуска скрипта:

enter image description here [/g5]

14
ответ дан Mike Grace 17 August 2018 в 17:39
поделиться
  • 1
    Это не работает, если строка полностью пуста, потому что .getDataRange () не берет пустые строки. – Benjamin 14 October 2014 в 03:43
  • 2
    Это сработало для меня, спасибо :) – Mohit Singh 17 January 2017 в 09:57
  • 3
    меню «Центр сценариев», похоже, не добавляется в мою таблицу. Я смущен тем, как это сделать / – Thieme Hennis 29 March 2018 в 08:28

Это то, что мне удалось сделать. Вы можете видеть, что я зацикливаюсь назад через лист, так что, когда строка была удалена, следующая строка не будет пропущена. Надеюсь, это поможет кому-то.

  function UpdateLog() {

  var returnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RetLog');
  var rowCount = returnSheet.getLastRow();

  for (i = rowCount; i > 0; i--) {
    var rrCell = 'G' + i;
    var cell = returnSheet.getRange(rrCell).getValue();
    if (cell > 0 ){
      logSheet.
      returnSheet.deleteRow(i);
    }
  }
}
2
ответ дан MikeD 17 August 2018 в 17:39
поделиться

Я могу предложить простое решение без использования скрипта!

Предположим, вы хотите удалить строки с пустым текстом в столбце C. Сортировка данных (меню данных -> Сортировка листа по столбцу C, A-> Z) в листе по столбцу C, поэтому все ваши пустые текстовые строки будут доступны вместе.

Просто выберите эти строки и щелкните правой кнопкой мыши -> удалить строки. Затем вы можете повторно сортировать свои данные в соответствии с нужным столбцом. Готово.

10
ответ дан roneo 17 August 2018 в 17:39
поделиться
  • 1
    Я не знаю, почему я об этом не думал! :-) Спасибо. – kzahel 14 April 2016 в 21:55

довольно простой запрос. Попробуйте следующее:

 function try_It(){
 deleteRow(2); //// choose col = 2 for column C
 }

 function deleteRow(col){ // col is the index of the column to check for 0 or empty
 var sh = SpreadsheetApp.getActiveSheet();
 var data = sh.getDataRange().getValues();
 var targetData = new Array();
 for(n=0;n<data.length;++n){
 if(data[n][col]!='' && data[n][col]!=0){ targetData.push(data[n])};
 }
 Logger.log(targetData);
 sh.getDataRange().clear();
 sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);
 }

EDIT: повторное чтение вопроса. Я не уверен, что вопрос требует «жить» на функции редактирования или функции (например, выше) применять после ввода данных ... Мне это не очень понятно ... поэтому не стесняйтесь быть более точными, если это необходимо;)

1
ответ дан Serge insas 17 August 2018 в 17:39
поделиться
  • 1
    Просто для информации, другой ответ лучше, так как мой не обрабатывает формулы (если когда-либо есть формулы в SS) и более прост. – Serge insas 16 November 2012 в 13:42
  • 2
    Я думаю, что код этого ответа является наиболее эффективным с точки зрения выполнения времени. Это следует использовать, когда на листе только значения ячейки (нет заметок, комментариев, проверки данных, пользовательского форматирования, ...). – Rubén 20 September 2016 в 02:26

Этот простой код выполнил эту работу для меня!

    function myFunction() {

      var ss = SpreadsheetApp.getActiveSpreadsheet();  // get active spreadsheet

      var activeRow = ss.getActiveRange().getRowIndex();  // get active/selected row

var start=1;
var end=650;
var match='';
var match2=0;   //Edit this according to your choice.

     for (var i = start; i <= end; i++) {
      var columnC = ss.getRange("C"+i).getValue();
      if (columnC ==match  || columnC ==match2){ ss.deleteRow(i); }
     }
    }
0
ответ дан Udayraj Deshmukh 17 August 2018 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: