Можно ли вытащить разные наборы данных из одного столбца? - PullRequest
1 голос
/ 22 июня 2019

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

Я попытался переписать код несколькими различными способами, который просматривает все данные и просто смещает строку назначения на 1. Но он не распознает, что он извлекает разные данные.

Ниже приведен код, который работает. То, что он делает, начинается с 1-го столбца 2-й строки (где начинаются мои данные). Данные в виде списка:

     A
1   Customer1
2   item1
3   item2
4   Item3 
5 
6   Customer2
7   Item1

Формулы, которые у меня есть в этих ячейках, просто объединяют некоторые другие ячейки. Используя цикл, он просматривает столбец A и находит пустое пространство. Затем он «разбивает» любое число, на котором останавливается, числовую нотацию A1 ячейки, затем находит значения для этих ячеек и переносит их на другой лист в правильной строке.

Проблема с кодом, который работал лучше всего, состоит в том, что ни одна из ячеек не читается как пустая (из-за формул?) и он переносит все в одну строку.

     function transpose(){
     var data = SpreadsheetApp.getActiveSpreadsheet();
     var input =data.getSheetByName("EMAIL INPUT");
     var output = data.getSheetByName("EMAIL OUTPUT");
     var lr =input.getLastRow();


    for (var i=2;i<20;i++){
    var cell = input.getRange(i, 1).getValue();

    if (cell == ""){
     break

     }

     }
    var set = input.getRange(2, 1, i-1).getValues();



      output.getRange(2,1,set[0].length,set.length) . 
     .setValues(Object.keys(set[0]).map ( function (columnNumber) {
     return set.map( function (row) {
     return row[columnNumber];
      });
      }));
      Logger.log(i);
      Logger.log(set);
       }

Мне нужен код, чтобы просмотреть все данные и разделить наборы данных по условию. Затем перенесите эту информацию на другой лист. Каждый набор (или массив) данных будет находиться в отдельной строке. Каждый компонент заполняется по столбцу (["customer1", "Item1", "Item2"].

EDIT: Можно ли извлечь разные наборы данных из одного столбца и превратить их в массивы? Я верю, что возможность сделать это сработает, если я использую "appendrow", чтобы переставить свои разные массивы туда, где они мне нужны.

1 Ответ

0 голосов
/ 30 июня 2019

Тест для длины ячейки. Даже если это формула, результат оценивается на основе значения.

if (cell.length !=0){
  // the cell is NOT empty, so do this
}
else
{
  // the cell IS empty, so do this   instead
}

EXTRA Этот код выполняет вашу задачу и выполняет транспонирование данных.

Код не так эффективен, как мог бы / должен, потому что он включает в себя getRange и setValues внутри цикла. В идеале весь выходной диапазон может / должен быть установлен в одной команде, но (без ответа) задача состоит в том, чтобы заранее знать максимальное количество строк в непрерывном диапазоне, чтобы можно было задавать пустые значения для строк, которые имеют меньше максимального числа строк.

Это было бы полезным изменением.


function so5671809203() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var inputsheetname = "EMAIL_INPUT";
  var inputsheet = ss.getSheetByName(inputsheetname);

  var outputsheetname = "EMAIL_OUTPUT";
  var outputsheet = ss.getSheetByName(outputsheetname);


  var inputLR =inputsheet.getLastRow();
  Logger.log("DEBUG: the last row = "+inputLR);
  var inputrange = inputsheet.getRange(1, 1,inputLR+1);
  Logger.log("the input range = "+inputrange.getA1Notation());
  var values = inputrange.getValues();

  var outputval=[];
  var outputrow=[];
  var counter = 0; // to count number of columns in array

  for (i=0;i<inputLR+1;i++){
    Logger.log("DEBUG: Row:"+i+", Value = "+values [i][0]+", Length = "+values [i][0].length);

    if (values [i][0].length !=0){
      // add this to the output sheet 
      outputrow.push(values [i][0]); 
      counter = counter+1;
      Logger.log("DEBUG: value = "+values [i][0]+" to be added to array. New Array Value = "+outputrow+", counter = "+counter);
    }
    else
    {
      // do nothing with the cell, but add the existing values to the output sheet
      Logger.log("DEBUG: Found a space - time to update output");

      // push the values onto an clean array
      outputval.push(outputrow);
      // reset the row array
      outputrow = []; 

      // get the last row of the output sheet
      var outputLR =outputsheet.getLastRow();
      Logger.log("DEBUG: output last row = "+outputLR);

      // defie the output range
      var outputrange = outputsheet.getRange((+outputLR+1),1,1,counter);
      Logger.log("DEBUG: the output range = "+outputrange.getA1Notation());

      // update the values with array
      outputrange.setValues(outputval);

      // reset the row counter
      counter = 0;
      //reset the output value array
      outputval=[];
    }
  }
}

Листы ввода и вывода электронной почты
Email Input Sheet Email Out Sheet

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