Найдите совпадение между двумя значениями на разных листах и ​​извлеките данные из другого столбца на первый лист с помощью скрипта приложения Google - PullRequest
0 голосов
/ 27 сентября 2019

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

Чтобы быть более точным:

  • Лист 1 Col E: много ссылок
  • Лист 2 Col A: много ссылок, которые могут совпадать с ref из Листа 1 Col E
  • Лист 1, столбец I: пустые ячейки, ожидающие заполнения
  • Лист 2, столбец D: данные, которые будут помещены в лист 1, столбец I, если совпадения ссылок

Я не могу понять, как сохранить эти данные и сделать ввод на другом листе.

Ниже того, что я нашел до сих пор:

function updateNote() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssDeCo = ss.getSheetByName("Deco");
  var lr1 = ssDeCo.getLastRow();
  var ssDataBase = ss.getSheetByName("Database");
  var lr2 = ssDataBase.getLastRow();

  for (var i = 2; i < lr1; i++) {
    var gencodDeCo = ssDeCo.getRange('E').getValue();
    for (var j = 2; i < lr2; i++) {
      var gencodDataBase = ssDataBase.getRange('A').getValue();
      var evalDataBase = ssDataBase.getRange('D').getValue(); 
      if (gencodDeCo[i] == gencodDataBase[j]) {
         ssDeCo.getRange('I').setValue(evalDataBase);
      }
    }
  }
};

1 Ответ

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

ОП пытается сопоставить данные из Листа 1 с Листом 2, а затем заполнить ячейку в Столбце I соответствующей строки на Листе 1 данными из Столбца D соответствующего значения Листа2.Проблема ОП заключалась в получении соответствующих данных для столбца D листа 2 и последующем сохранении их в соответствующую строку столбца D на листе 1.

Соответствующие различия с кодом ОП:

  • Выполнить все getValues() методы до цикла => более быстрый и эффективный код.
  • Данные базы данных получаются в двух транзакциях.
    • 1) все данные в электронной таблице (включая столбец A и столбец D) и
    • 2) только столбец A;это делается для создания единого массива для сопоставления.
  • Данные деко получают только один раз - для столбца D.

  • Значения для столбца D деко и столбца A базы данных являются двумерными массивами;чтобы упростить сопоставление, они оба «сведены» в одномерные массивы.
    • 2D-значение getValues() может выглядеть следующим образом:
      [[r88], [g90], [h105], [i119], [j125], [k133], [l142],[m154], [n164]]
    • массив 1D после «выравнивания» будет выглядеть так:
      [r88, g90, h105, i119, j125, k133, l142, m154, n164]

  • Существует один цикл, основанный на значениях из столбца деко D.
    • Каждое значение сравнивается со столбцом базы данных А.
    • Для поиска совпадений используется метод Indexof.
    • Результирующее значение - это первый индекс, по которому значение может быть найдено в массиве, или -1, если его нет.

  • Соответствующее значение из столбца базы данных D получено и «помещено» во временный массив («updateColI»).
  • Когдацикл завершен, вновь созданный массив используется с методом setValues() для обновления значений в столбце Deco. D

Я оставил в коде несколько операторов "Logger"так что пользователь может найти соответствующиезначения по мере выполнения кода.


function so5813783501() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssDeCo = ss.getSheetByName("Deco");
  var lr1 = ssDeCo.getLastRow();
  var ssDataBase = ss.getSheetByName("Database");
  var lr2 = ssDataBase.getLastRow();

  // get the data from database
  var dbRange =ssDataBase.getRange(2,1,lr2-1,4);
  // Logger.log("DEBUG: dbRange = "+dbRange.getA1Notation());
  var dbData = dbRange.getValues();

  // get ColA data from database
  var dbColA = ssDataBase.getRange(2,1,lr2-1,1);
  // Logger.log("DEBUG: dbColA = "+dbColA.getA1Notation());
  var dbColAData = dbColA.getValues();

  // flatten the data on ColA of the database
  var flatCola =dbColAData.reduce(function(a, b){return a.concat(b);});
  // Logger.log(flatCola); // DEBUG

  // get the data from Deco
  var decoRange = ssDeCo.getRange(2,5,lr1-1,1);
  // Logger.log("DEBUG: decoRange = "+decoRange.getA1Notation());
  var decoData = decoRange.getValues();
  // Logger.log(decoData); DEBUG

  // flatten the Deco data array
  var flatDeco =decoData.reduce(function(a, b){return a.concat(b);});
  // Logger.log(flatDeco); // DEBUG

  var updateColI = [];

  // Loop through the Deco data to find match on Database
  for (var i=0;i<decoData.length;i++){

    // find a match on database Column A
    var idx = flatCola.indexOf(decoData[i][0]);
    //Logger.log("DEBUG: i = "+i+", value = "+decoData[i][0]+", and idx = "+idx)

    // if idx = -1, then no match, otherwise macth value if the sequence number on the database.
    if (idx !=-1){
      // do something
      updateColI.push([dbData[idx][3]]);
    }
    else{
      updateColI.push([""]);
    }
  }

  // Logger.log(updateColI); //DEBUG

  // update Deco
  var fillDeco = ssDeCo.getRange(2,9,lr1-1,1);
  Logger.log("DEBUIG: Fill Deco range = "+fillDeco.getA1Notation())
  fillDeco.setValues(updateColI);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...