Сценарий Google Apps выбирает определенные строки с определенными столбцами - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь понять, как вытащить только определенные строки и столбцы, используя скрипт Google Apps. = QUERY не вариант для использования. Нужно сохранить всю логику в скрипте - мой фактический набор данных довольно большой. Чтобы проиллюстрировать, что я пытаюсь решить. У меня есть небольшая таблица данных испытаний. TestData Из которого мне нужны только столбцы 2,3,5 (индекс на основе нуля) и только строки с "мехом".

function testFour(sheetID, fromTabName, toTabName) {
  var sourceTab = SpreadsheetApp.openById(sheetID).getSheetByName(fromTabName);
  var values = sourceTab.getDataRange().getValues();
  var columns = [2,3,5]; //only want these columns
  var output = new Array();
  for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[0].length; j++) {
      if (values[i][4] == "fur") { // only want these rows
        if (j in columns) {
          output.push(values[i][j]);
       }
      }
    }
  }
  var targetTab = SpreadsheetApp.openById(sheetID).getSheetByName(toTabName);
  targetTab.getRange(1, 1, output.length, columns.length).setValues(output);
}

Этот бит кода работает, но его не очень легко обслуживать, если столбцов много:

for(n=0; n < values.length; ++n) {
  var columns = [2,3,5];
  if (values[n][4] === 'fur') { 
    output.push( [values[n][2], values[n][3], values[n][5]]); 
  }

Когда я запускаю функцию testFour, я получаю сообщение об ошибке «Невозможно преобразовать массив в объект [] [] в этой строке кода:

targetTab.getRange(1, 1, output.length, columns.length).setValues(output);

Ценю любую помощь. Я был очень удивлен, что не нашел никаких примеров этого. Каждое решение использовало = QUERY на листе.

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Report Builder

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

Функция:

function testFour(t4Obj) {
  var ss=SpreadsheetApp.openById(t4Obj.ssId);
  var srcsh=ss.getSheetByName(t4Obj.srcShName);
  var dessh=ss.getSheetByName(t4Obj.desShName);
  var colA=String(t4Obj.zbcols).split('~~~');
  var tstCol=Number(t4Obj.zbtstCol);
  var tstVal=t4Obj.tstVal;
  var srcrg=srchsh.getDataRange();
  var srcvA=srcrg.getValues();
  var desvA=[];
  for (var i=0;i<srcvA.length;i++) {
    var tA=[];
    if (srcVa[i][tstCol]==tstVal) {
      for (var j=0;j<colA.length;j++) {
        tA.push(colA[j]);
      }
      desvA.push(tA);
    }
  }
  dessh.getRange(1, 1, desvA.length, desvA[0].length).setValues(desvA);
}

Таблица данных t4Obj:

enter image description here

Конечно, вам придется создать себе функцию, которая загружает t4Obj из приведенной выше таблицы.Посмотрев на ваш код, я думаю, что это не составит для вас проблем.

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

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

var A=[[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24][5,10,15,20,25]];

Создание массива вручную

function makeArray() {
  var A=[[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24],[5,10,15,20,25]];
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var rg=sh.getRange(5,5,5,5);//could be this way
  //var rg=sh.getRange(5,5,A.length,A[0].length);//or in most programs this way
  rg.setValues(A);
}
0 голосов
/ 22 марта 2019

Исходя из вышеизложенного предложения Купера, я смог заставить это работать:

function testFourNew(sheetID, fromTabName, toTabName) {
  var sourceTab = SpreadsheetApp.openById(sheetID).getSheetByName(fromTabName);
  var targetTab = SpreadsheetApp.openById(sheetID).getSheetByName(toTabName);
  var srcrg = sourceTab.getDataRange();
  var srcvA = srcrg.getValues();
  var desvA=[];
  // var columns = [2,3,5]; //only want these columns
  var columns = String("2,3,5").split(','); //only want these columns
  var tstVal = "fur"; 
  var tstCol = 4; 
  for (var i=0;i<srcvA.length;i++) {
    var tA=[];
    if (srcvA[i][tstCol] ==tstVal) {
      for (var j=0;j<columns.length;j++) {
        //Logger.log(srcvA[i][columns[j]]);
        tA.push(srcvA[i][columns[j]]);
      }
      desvA.push(tA);
    }
  }
  targetTab.getRange(1, 1, desvA.length, desvA[0].length).setValues(desvA);
}

Спасибо Куперу за ваше руководство и предложения!

0 голосов
/ 05 марта 2019

EDIT:

Не нужно [] вокруг output, если использовать эту строку для вывода -

output.push( [values[n][2], values[n][3], values[n][5]]);

Чтобы установить значения по строке, данные должны быть в этом формате -

[ row,
  row ]

или

[ [1,2,3],
  [4,5,6] ]

Cannot covert Array to Object[][] Ошибка отображается, когда диапазон и формат значения не совпадают.


Попробуйте эту строку -

targetTab.getRange(1, 1, output.length, columns.length).setValues([output]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...