Google Sheets - двусторонний поиск, извлекающий данные из нескольких вкладок - PullRequest
1 голос
/ 25 сентября 2019

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

В моем примере:

Sheet1 = вкладка ввода

Sheet2 = вкладка вывода

Я хочу иметь vlookup, который будет извлекать свой ключ search_key из Sheet2 (выходной) и искать его по диапазону в Sheet1.

Я возился со следующим (зеленая ячейка Sheet2 в примере):

=IFERROR(VLOOKUP(A2,Sheet1!$A$2:$C$7,MATCH(B1,Sheet1!$A$2:$C$7,0),False))

Я также попробовал вариант этого с использованием hlookup вместоСовпадение, но мне не повезло с этим.

Проблема, с которой я столкнулся, заключается в том, что я больше не знаю, где разместить индекс столбца.В моем примере листа он работает с односторонним vlookup (синяя ячейка Sheet2), который возвращает желаемое значение из Sheet1 (длина столбца), используя этот индекс.Разве не возможно сделать это в двухстороннем поиске ??

Вот ссылка на пример: https://docs.google.com/spreadsheets/d/1_nqH-XOxNhQAUVJzesNBZeMci7AV9RowSQUnptAruPc/edit?usp=sharing

1 Ответ

2 голосов
/ 26 сентября 2019

Попробуйте запустить эту функцию в Apps Script:

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheetByName('Sheet1');
  var sheet2 = ss.getSheetByName('Sheet2');
  var firstRow = 2;
  var numRows = sheet1.getLastRow() - 1;
  var firstCol = 1;
  var numCols = sheet1.getLastColumn();
  var inputData = sheet1.getRange(firstRow, firstCol, numRows, numCols).getValues();
  var numBrands = sheet2.getLastRow();
  var outputRange = sheet2.getDataRange();
  var outputData = outputRange.getValues();
  // Iterating through each row in Sheet1 data:
  for(var i = 0; i < numRows; i++) { 
    // Iterating through each row in Sheet2:
    for(var j = 1; j < outputData.length; j++) { 
      // Iterates through each cell for each row in Sheet2.
      for(var k = 1; k < outputData[0].length; k++) { 
        var inputBrand = inputData[i][0];
        var outputBrand = outputData[j][0];
        var inputDate = inputData[i][1];
        var outputDate = outputData[0][k];
        // It checks whether the date and brand corresponding to each cell 
        // (same row or column) matches the date and brand in the current 
        // row in Sheet1
        if(inputBrand == outputBrand && inputDate.toString() == outputDate.toString()) {
          var inputLength = inputData[i][2];
          sheet2.getRange(j+1, k+1, 1, 1).setValue(inputLength);
        }      
      }  
    }
  }
}
...