繁体   English   中英

在不同工作表上的 2 个值之间搜索匹配项,并使用 google app 脚本将另一列中的数据检索到第一张工作表中

[英]Search for a match between 2 values on different sheets and retrieve data from an other column into the first sheet with google app script

情况如下:我有一张表,其中有一列中的数据,我想,如果在我的第二张表中(在已识别的列中)有数据匹配,则将另一列中的数据检索到我的第一张表中。

更明确地说:

  • 表 1 Col E:许多参考资料
  • Sheet 2 Col A:许多可以与 Sheet 1 Col E 中的参考匹配的参考文献
  • 表 1 Col I:等待填充的空单元格
  • 表 2 Col D:如果有参考匹配,则表 1 Col I 中的 go 的数据

我不知道如何存储这些数据并在另一张表中进行输入。

以下是我到目前为止发现的内容:

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);
      }
    }
  }
};

OP 正在尝试将 Sheet1 中的数据匹配到 Sheet 2,然后使用匹配的 Sheet2 值的 D 列中的数据填充 Sheet 1 上相应行的 I 列中的单元格。 OP 的问题在于获取相关的 Sheet 2 Column D 数据,然后将其保存到 Sheet1 中 D 列的相应行。

与 OP 代码的相关差异是:

  • 在循环之前执行所有getValues()方法 => 更快、更高效的代码。
  • 数据库数据是在两个事务中获得的。
    • 1) 电子表格上的所有数据(包括 A 列和 D 列),以及
    • 2)单独的A列; 这是创建一个用于匹配的数组。
  • Deco 数据仅获得一次 - 对于 D 列。

  • Deco D 列和数据库 A 列的值为 2D arrays; 为了简化匹配,它们都被“展平”为一维 arrays。
    • getValues()的 2D 值可能如下所示:
      [[r88]、[g90]、[h105]、[i119]、[j125]、[k133]、[l142]、[m154]、[n164]]
    • 一维数组,在“展平”之后,看起来像这样:
      [r88、g90、h105、i119、j125、k133、l142、m154、n164]

  • 有一个基于 Deco Column D 值的循环。
    • 每个值都与数据库列 A 进行比较。
    • Indexof方法用于查找匹配项。
    • 结果值是可以在数组中找到该值的第一个索引,如果不存在,则为 -1。

  • 获取数据库列 D 中的相关值并将其“推送”到临时数组(“updateColI”)。
  • 循环完成后,新创建的数组与setValues()方法一起使用,以更新 Deco Column D 中的值

我在代码中留下了一些“记录器”语句,以便用户可以在代码进行时找到相关值。


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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM