2017-02-21 57 views
0

У меня есть этот код в скрипте Google для получения массивов из Sheet1 по критериям в Sheet2 на Sheet3. Но теперь массивы помещаются только один под другим. Мне нужно размещать каждый новый массив из «v» в следующих 5 столбцах, как в примере на моей электронной таблице.Объединить несколько массивов бок о бок сценарий google

Во-вторых - до этого я использовал фильтр с формулой поиска, позволяющий использовать подстановочные знаки типа * или?. Как я могу использовать подстановочные знаки или регулярное выражение в моей новой функции?

Я был бы признателен за любую помощь.

function getval(){ 

     var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); 
     var sspodbor = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet3"); 

     var range = ss.getRange("A2:A29"); 
     var values = range.getValues(); 

     var rangez = sheet.getRange("A1:A14"); 
     var valuesz = rangez.getValues(); 

     var z = [] 
     for (var x = 0; x<valuesz.length; x++){ 
     z.push(valuesz[x]) 
     } 

     var v = []; 
     for (var q = 0; q < valuesz.length; q++){ 
     for (var s = 0; s < values.length; s++){ 
      if(values[s][5] == z[q]){ 
      v.push([values[s][0],values[s][1],values[s][2],values[s][3],values[s][4]]); 
      } 
//I am guessing that here must be a separating function  
     } 
     } 
     var range = sspodbor.getRange(4, 1, v.length,v[0].length); 
     range.setValues(v); 
    } 

Моей таблица: https://docs.google.com/spreadsheets/d/1o7ErbeFHA7yyxMC0HMn3Uj5ZBRcy2uAwa1UpolVpBFI/edit?usp=sharing

+1

Несколько мелочей: первый диапазон var = ss.getRange ("A2: A29"); вероятно, должен быть var range = ss.getRange («A2: F29»); и, во-вторых, var z = [] должен быть var z = []; Но для меня большой вопрос - как вы их группируете. Sheet2 имеет только 14 значений. Таким образом, только 14 значений q, и вы покажете 16 столбцов в вашем примере. Итак, как вы их группируете, – Cooper

+0

Привет, @Cooper! Как вы видите, я узнал что-то о массивах из вашего предыдущего ответа! Я сгруппировал их очень простым способом: в цикле с q var я беру одну ячейку из rangez, а затем в цикле с s var. Я проверяю, является ли какое-то значение из значений равным ему, я нажимаю его на v-массив. И когда я беру следующий q var, мне нужно снова нажать равные значения от 0-4 до следующих столбцов. – Davagaz

+0

В итоге я включил значение q: if (values1 [s] [5] == z [q]) {v .push ([values1 [s] [0], values1 [s] [1], values1 [s] [2], values1 [s] [3], values1 [s] [4], q]);} вдоль с вашими выходными данными, потому что это казалось общим для каждой группы. – Cooper

ответ

1

Распространение групп из Горизонтально

Это не самое красивое решения, которое вы будете когда-либо видеть, и, надеюсь, другие будут искать его и сделать улучшение, но здесь это.

function getval() 
{ 
    var Sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var Sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); 
    var output = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("output"); 
    var knew = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('knew'); 
    var knewrange = knew.getRange(1,1,10,100); 
    var pipe = ''; 

    var range1 = Sheet1.getRange("A2:F29"); 
    var values1 = range1.getValues(); 

    var range2 = Sheet2.getRange("A1:A14"); 
    var values2 = range2.getValues(); 

    var z = []; 
    for (var x = 0; x<values2.length; x++) 
    { 
    z.push(values2[x]) 
    } 
    var v = []; 
    for (var q = 0; q < values2.length; q++) 
    { 
    for (var s = 0; s < values1.length; s++) 
    { 
     if(values1[s][5] == z[q]) 
     { 
     v.push([values1[s][0],values1[s][1],values1[s][2],values1[s][3],values1[s][4],q]); 
     } 
    } 
    } 
    var vlength=v.length; 
    var range3 = output.getRange(1, 1, v.length,6); 
    range3.setValues(v); 

    var w = []; 
    var voff = 0; 
    var hoff = 0; 
    for(var m=0;m<10;m++) 
    { 
    w[m]=[]; 
    for(var n=0;n<100;n++) 
    { 
     w[m][n]='' ; 
    } 
    } 
    var color = ['yellow','orange']; 
    for(var i=0;i<v.length;i++) 
    { 
    for(var j=0;j<5;j++) 
    { 

     if(i-voff==0){knew.getRange((i-voff + 1),(j + hoff + 1),4,5).setBackground(color[v[i][5] % 2])}; 
     if((i-voff)==0 || v[i][5] == v[i-1][5]) 
     { 
     w[i - voff][j + hoff]=v[i][j]; 
     } 
     else 
     { 
     voff = i; 
     hoff += 5; 
     w[i - voff][j + hoff]=v[i][j]; 
     } 
    } 
    } 
    knewrange.setValues(w); 
} 

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

+0

Эй, @ Коупер! Проверьте свой ответ - он работает хорошо, и у него есть много функций и операторов, новых для меня, которые я должен понять. Рассматривая ваш ответ, я понял, что достаточно переместить SetValue в цикле «q», добавить к нему еще один массив и установить номер columt 1 вместо (q + 1) * 5. Это так просто, спасибо! – Davagaz

+0

Да, добавление q в набор данных позволило получить доступ к циклу так, что когда q [i]! == q [i = 1], то это групповой транзистор, который я выбрал для создания массива w и инициализации в измерениях больше, чем мне нужно, поэтому я бы всегда избегал ошибок измерения. Тем не менее, вам нужно быть осторожным, потому что обновление большого массива внутри цикла затрачивает много ресурсов, хотя обновление такого экрана действительно помогает выяснить, что происходит. Вероятно, вы можете сделать размер w 5 * числом групп по максимальному размеру группы. – Cooper

 Смежные вопросы

  • Нет связанных вопросов^_^