Вывод функции GAS не отдельного значения ячейки, а полного столбца значений - PullRequest
0 голосов
/ 27 апреля 2019

Я новичок в скрипте Google Apps.Я создал скрипт Google Apps для альтернативы vlookup (я хочу статические данные по причинам).

Я создал функцию, которая может обмениваться данными между Листом 1 «Основной лист» (ввод пользователя) и Листом 2 «Лист запроса» (содержит результаты данных).

Предполагается сравнить mainSheet ColW с querySheet ColA

Если mainSheet ColW совпадает, замените значение в mainSheet ColX на значение querySheet ColB в соответствующей строке.

Пример, если mainSheet Col W2 равен «123», а querySheet Col A5 равен «123», вставьте значение из querySheet Col B5 в mainSheet Col X2

Это для сравнения входных данных, предоставленных пользователем сданные, которые обновляются в бэкэнде после X периода времениЧтобы уменьшить необходимость постоянного просмотра этих данных, запрос выполняется с интервалами.Пользовательский лист заполняется результатами.

function match(){

  //Sheet with the query outputs
  var querySheet = SpreadsheetApp.openById("SHEETID123456789"); // query results are dumped in this doc

  var querySheetTab = querySheet.getRange("query!A1:F"); //tab with the results

  //Main sheet to have query data pasted
  var mainSheet = SpreadsheetApp.getActiveSpreadsheet(); //current worksheet

  var mainSheetTab = mainSheet.getRange("USERSHEET!W2:X"); //Tab and range of the data. W contains a number. X is where the results of B from the querySheet go

  //values to compare
  var mainSheetVal = mainSheet.getSheetByName('USERSHEET').getRange('W2:W').getValues(); //values to match against query results

  var mainSheetComp = mainSheet.getSheetByName('USERSHEET').getRange('W2:W'); //numbers to match against query results

  var mainSheetSet = mainSheet.getSheetByName('USERSHEET').getRange('X2:X'); //Where values get pasted. 

  var getValQS = querySheet.getSheetByName('query').getRange('A1:B').getValues(); //query results includes both objects values

  var valQS = querySheet.getSheetByName('query').getRange('A1:A'); // query results

  var valSet = querySheet.getSheetByName('query').getRange('B2:B'); //desired values to paste.

  var output = [];

  for (var i = 0; i < mainSheetVal.length; i++) {
    mainSheetSet.setValue(getValQS[i][0]);
    SpreadsheetApp.flush();
    Utilities.sleep(10000);
    if (mainSheetComp.getValue() == '') {
      output.push([getValQS[i][0]]);
    }
  }
  mainSheet.getRange(2, 12, output.length, 2).setValues(output);
}

Этот лист в конечном итоге заменяет X2: X значением A1, затем A2, и продолжает циклически проходить даже с пустыми ячейками.Я не смог настроить правильное сравнение.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

Попробуйте это:

Это сравнивает столбец W основного листа со столбцом A листа запроса и помещает значение в столбце B листа запроса в столбец X основного листа в той же строке, что и совпадение в столбцеО. Это может быть немного быстрее, если вывести setValue из цикла, но я не хотел возиться с записью других ваших данных.Кроме того, я не проверил это, поэтому всегда есть возможность исправлений.

function match() {
  var qss=SpreadsheetApp.openById('id');
  var qsh=qss.getSheetByName('query');
  var qrgA=qsh.getRange(2,1,qsh.getLastRow(),1);//colA
  var qrgB=qsh.getRange(2,2,qsh.getLastRow(),1);//colB
  var qvB=qrgB.getValues();
  var qvA=qrgA.getValues();
  var qvAf=qvA.map(function(r){return r[0]});//flatten array
  var mss=SpreadsheetApp.getActive();
  var msh=mss.getSheetByName('USERSHEET');
  var mrg=msh.getRange(2,23,msh.getLastRow(),1);//colW
  var mVa=mrg.getValues();
  for(var i=0;i<mVa.length;i++) {
    var index=qvAf.indexOf(mvA[i][0]);
    if(index>-1) {
      msh.getRange(i + 2,24).setValue(qvB[index][0]);//put matches in same row of columnX
    }
  }
}
0 голосов
/ 27 апреля 2019
  • Вы хотите сравнить значение столбца "W" USERSHEET листа со значением столбца "A" query листа.
  • Если оба значения одинаковы, вы хотите поместить значение столбца "B" листа query в ячейку столбца "X" листа USERSHEET.

Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Очки модификации:

  • Значения USERSHEET были получены из "W: X" одним вызовом.
  • Значения USERSHEET были изменены, когда значение столбца "A" query совпадает со значением столбца "W" USERSHEET.
    • После того, как значения USERSHEET были изменены, измененные значения были установлены в USERSHEET.

Модифицированный скрипт:

function match(){
  var querySheet = SpreadsheetApp.openById("SHEETID123456789").getSheetByName("query");
  var queryValues = querySheet.getRange(1, 1, querySheet.getLastRow(), 2).getValues(); // A:B
  var mainSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("USERSHEET");
  var mainRange = mainSheet.getRange(2, 23, mainSheet.getLastRow() - 1, 2); // W:X
  var mainValues = mainRange.getValues();
  for (var i = 0; i < mainValues.length; i++) {
    for (var j = 0; j < queryValues.length; j++) {
      if (mainValues[i][0] == queryValues[j][0]) {
        mainValues[i][1] = queryValues[j][1];
      }
    }
  }
  mainRange.setValues(mainValues);
}

Примечание:

  • В этой модификации столбцы "W" и "X" USERSHEET перезаписываются. Если вы хотите изменить эту ситуацию, скажите, пожалуйста.

Если я неправильно понял ваш вопрос, прошу прощения.

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