Манипулирование данными на листах и ​​удаление строк, если некоторые ячейки не заполнены - PullRequest
0 голосов
/ 20 марта 2019

Этот вопрос похож на «Манипуляции с данными форм в Google Sheets» (https://webapps.stackexchange.com/questions/88736/forms-data-manipulation-in-google-sheets), но требует немного большей автоматизации:

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

Здесьмой пример листа: https://docs.google.com/spreadsheets/d/11DM7z_vwuR1S6lgMN7Wu7a0GoouVc2_5xj6nZ1Ozj5I/edit#gid=1967901028

Ответы формы : лист, который возвращает ответы пользователей, заполнивших форму

Манипулируемые строки: лист, которыйвозвращает измененные строки, используя: = OFFSET («Ответы формы»! $ A $ 2, потолок ((row () - строка ($ B $ 1)) / 5,1) -1, column () - столбец ($ B $ 1),1, COUNTA ($ B $ 1: $ D $ 1)) в ячейке B2, и

= OFFSET («Ответы формы»! $ A $ 2, потолок ((row () - строка)($ B $ 1)) / 5,1) -1, мод (строка () - (строка ($ B $ 1) + 1), 5) * СЧЕТЗ ($ E $ 1: $ N 1) + СЧЕТЗ ($ B $ 1: $ D $ 1), 1, COUNTA ($ E $ 1: $ N $ 1)) в ячейке E2

В прошломe Значения : этот лист возвращает значения вставки Манипулированные строки , исключая формулу смещения и затем удаляя все строки с пустыми ячейками EN.Вот скрипт приложений, отраженный на вкладке «Вставить значения»:

var ss = SpreadsheetApp.getActive();
var sheet = SpreadsheetApp.getActiveSheet();

//Duplicate sheet 'Manipulated Rows' as paste values
function moveValuesOnly() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Paste Values');
  var source = ss.getRange('Manipulated Rows!A1:T100000');
  source.copyTo(ss.getRange('Paste Values!A1'), {contentsOnly: true});
  deleteRows(sheet);
}

//Function to Delete empty rows:
function deleteRows(sheet) {
  var rows = sheet.getDataRange();
  var range_manipulated_rows = ss.getSheetByName('Manipulated Rows!A1:T100000');
  var range_paste_values = ss.getSheetByName('Paste Values!A1:T100000');
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (range_manipulated_rows == range_paste_values && row[4] == '' && row[5] == '' && row[6] == '' && row[7] == '' && row[8] == '' && row[9] == '' 
        && row[10] == '' && row[11] == '' && row[12] == '' && row[13] == '') { // if paste values tab is equal to manipulated rows tab and cell E-N are blank
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};

Я хочу сделать это более автоматизированным, создав скрипт приложений, который будет непосредственно преобразовывать лист «Ответов формы» влист «Вставить значения» без использования манипулируемых строк.Как и в листе «Вставить значения», необходимо удалить все строки, в которых все ячейки EN пусты.

1 Ответ

2 голосов
/ 15 апреля 2019
  • Вы хотите напрямую преобразовать значения «Ответ формы» в «Вставить значения» с помощью скрипта Google Apps.
  • Существует 5 циклов от «Адреса» до «Есть ли у вас другой запрос на принтер?» из столбцов от "D" до "AZ". Данные могут быть 1 цикл и 3 цикла. Но максимум 5 циклов постоянны.

Из твоего вопроса и комментариев я мог понять выше. Как насчет этого примера сценария?

Пример сценария:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var src = ss.getSheetByName("Form Responses");
  var dst = ss.getSheetByName("Paste Values");
  var values = src.getDataRange().getValues();
  var header = values.splice(0, 1)[0].splice(0, 13);
  var res = values.reduce(function(ar, e) {
    var h = e.splice(0, 3);
    h.unshift("");
    for (var i = 0; i < 5; i++) {
      var temp = e.splice(0, 10);
      if (temp.filter(String).length == 0) continue;
      if (temp.length < 10) temp.splice(temp.length, 10 - temp.length, "");
      ar.push(h.concat(temp));
    }
    return ar;
  }, []);
  if (dst.getRange("A1").getValue() != "Status") res.unshift(["Status"].concat(header));
  dst.getRange(dst.getLastRow() + 1, 1, res.length, res[0].length).setValues(res);
}

Примечание:

  • В этом примере сценария используются имена листов Form Responses и Paste Values. Если вы хотите изменить имя листа, измените скрипт.
  • В этом примере сценария строка заголовка листа Paste Values устанавливается автоматически. Если вы не хотите устанавливать это, пожалуйста, измените скрипт.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...