【问题标题】:Google Sheets script - For each used cell in range 1, if cell value exists in range 2, get range 2 match's row numberGoogle 表格脚本 - 对于范围 1 中的每个使用的单元格,如果范围 2 中存在单元格值,则获取范围 2 匹配的行号
【发布时间】:2021-12-01 09:46:16
【问题描述】:

我觉得我的这个脚本几乎按预期工作,但我不确定在 for 循环中将过程的某些组件放置在何处以达到预期的结果。隧道视觉现在非常有效,我完全有可能过度思考一个简单的任务。如果我能更清楚地描述这个问题,请告诉我。对现有资源的任何建议或指示都会有所帮助。

设置:第一页包含从单元格 I3 开始向下的文本值的动态垂直列表。工作表 2 包含从 A2 范围开始向下的文本值的动态垂直列表,并且在 B 列的相同行中有一组类似的文本值。

目标:

  • 获取 Sheet1 第 I 列(范围一)中每个已使用单元格的值
  • 获取 Sheet2 A 列中每个已使用单元格的值(范围二)
  • 对于范围一中的每个使用的单元格,检查每个范围一的值 单元格以查看该值是否存在于范围二中
  • 如果存在匹配,则获取区域 2 中的单元格的行号 包含值(如果匹配,则只会有一个匹配 存在)
  • 获取Sheet2 B列同一行单元格的值
  • 将上述值设置为包含该值的行中的单元格值 在 Sheet1 Column M 的两个范围内找到

以下是我能想到的。我能够让它运行到最后一步。似乎匹配的 rowNumber 变量没有随着每个 for 循环而更新。

// Get values of range one
var lastRowRangeOne = sheetone.getRange('I3').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
var rangeOneValues = sheetone.getRange('I3:I' + lastRowClientColumn).getValues();

// Get values of range two
var sheettwo = spreadsheet.getSheetByName('Sheet2');
var sheettwoLastRow = sheettwo.getLastRow();
var sheettwoList = sheettwo.getRange('A2:A' + sheettwoLastRow).getValues();
var sheettwoListFlat = sheettwoList.map(function(row) {return row[0];});

    for (var i = 0; i< rangeOneValues.length ; i++){ // for each row in range one
    
      if (sheettwoListFlat[i] == rangeOneValues[i]) { // if the range one value exists in range two

        var rowNumber = sheettwoListFlat.indexOf(rangeOneValues[i]) + 3; // get the row number of the matching value found in range two
        var sheetOneColumnMValue = sheettwo.getRange('B' + rowNumber).getValue(); // get the cell value of the same row in sheet two column B
        var sheetOneRowNumber = i + 3; // get the row number of the range one value
        sheetone.getRange('M' + sheetOneRowNumber).setValue(sheetOneColumnMValue); // set the cell value of sheet one column M row x, where x is sheetOneRowNumber
      }

    }

【问题讨论】:

  • 请提供一个示例电子表格和所需的输出
  • 谢谢!想要的结果肯定比看起来简单。请在此处查看示例工作簿:docs.google.com/spreadsheets/d/… 我使用上述脚本的目标是,对于 I 列中的每个值,检查该值是否存在于表二的 A 列中。如果存在,则检索第二张表 B 列中等效行的值,并将该值插入与第一张表 M 列中的原始值匹配的行中。

标签: google-apps-script google-sheets


【解决方案1】:

如果打印sheettwoListFlat 的值,它只有5 个元素。一旦 for 循环的迭代器达到 5 个或更多,它会自动将 if (sheettwoListFlat[i] == rangeOneValues[i]) { 设置为 false。此外,该语句仅在两个数组的相同索引的元素相等时才有效。

如果您使用 Sheet2 的值搜索 Sheet1 也会更有效,因为 Sheet2 的值较小。

这里我使用TextFinder 来查找范围内的文本。

使用 Sheet2 值作为搜索键

代码:

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetone = spreadsheet.getSheetByName('Sheet1');

  var lastRowRangeOne = sheetone.getRange('I2').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  var rangeOneValues = sheetone.getRange('I2:I' + lastRowRangeOne);
  var sheettwo = spreadsheet.getSheetByName('Sheet2');
  var sheettwoLastRow = sheettwo.getLastRow();
  var sheettwoList = sheettwo.getRange('A2:B' + sheettwoLastRow).getValues();

  for (var i = 0; i < sheettwoList.length; i++){
    var find = rangeOneValues.createTextFinder(sheettwoList[i][0]).findNext()
    if(find){
      var sheetOneRowNumber = find.getRow();
      sheetone.getRange('M' + sheetOneRowNumber).setValue(sheettwoList[i][1]);
    }
  }
}

使用 Sheet1 值作为搜索键

代码:

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetone = spreadsheet.getSheetByName('Sheet1');

  var lastRowRangeOne = sheetone.getRange('I2').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  var rangeOneValues = sheetone.getRange('I2:I' + lastRowRangeOne).getValues();
  var sheettwo = spreadsheet.getSheetByName('Sheet2');
  var sheettwoLastRow = sheettwo.getLastRow();
  var sheettwoList = sheettwo.getRange('A2:B' + sheettwoLastRow);

  for (var i = 0; i< rangeOneValues.length ; i++){ // for each row in range one
    var find = sheettwoList.createTextFinder(rangeOneValues[i][0]).findNext();
    if(find){
      var rowNumber = find.getRow()
      var sheetOneColumnMValue = sheettwo.getRange('B' + rowNumber).getValue(); // get the cell value of the same row in sheet two column B
      var sheetOneRowNumber = i + 2;
      sheetone.getRange('M' + sheetOneRowNumber).setValue(sheetOneColumnMValue);
    }
  }
}

输出:

注意:两者产生相同的输出,但使用 Sheet2 值作为搜索键比另一个更快。

【讨论】:

  • 这比我想的要简单得多,在更小的范围内搜索值更有意义。谢谢。
【解决方案2】:
function compareTwoCols() {
  const c1 = 'COL1';//column names
  const c2 = 'COL3';
  const ss1 = SpreadsheetApp.openById(gobj.globals.datagenid);//data set 1
  const sh1 = ss1.getSheetByName('Sheet1');
  const [hd1, ...vs1] = sh1.getDataRange().getValues();
  let col1 = {};
  hd1.forEach((h, i) => { col1[h] = i });
  const ds1 = vs1.map((r, i) => {
    return r[col1[c1]];
  });
  const ss2 = SpreadsheetApp.openById(gobj.globals.ssid);//data set 2
  const sh2 = ss2.getSheetByName('Sheet0');
  const [hd2, ...vs2] = sh2.getDataRange().getValues();
  let col2 = {};
  hd2.forEach((h, i) => { col2[h] = i });
  const ds2 = vs2.map((r, i) => {
    return r[col2[c2]]
  });
  let matches = { pA: [] };
  let idx = -1;
  ds1.forEach((e, i) => {
    let from = '';
    do {
      idx = ds2.indexOf(e, from);
      if (~idx) {
        if (!matches.hasOwnProperty(e)) {
          matches[e] = [];
          matches[e].push({ val1: e, row1: i + 2, col1: col1[c1] + 1, row2: idx + 2, col2: col2[c2] +1 });
          matches.pA.push(e);
        } else {
          matches[e].push({ val1: e, row1: i + 2, col1: col1[c1] + 1, row2: idx + 2, col2: col2[c2] + 1});
        }
        from = idx + 1;
      }
    } while (~idx);
  });
  Logger.log(JSON.stringify(matches));
}

电子表格 1 表 1:

COL1 COL2 COL3 COL4 COL5
3 4 2 3 4
2 6 6 1 4
5 1 7 5 5
9 8 7 9 5
7 9 0 8 1
8 2 8 7 9
5 8 7 9 9
1 2 0 8 6
2 7 4 0 3
8 2 0 2 6

电子表格2 Sheet0:

COL1 COL2 COL3 COL4 COL5
5 1 2 7 6
4 5 7 8 2
6 3 8 1 5
0 7 6 3 6
4 7 6 1 7
5 6 9 2 1
3 0 2 2 8
4 5 0 8 1
1 3 9 2 2
3 6 7 0 3

匹配对象:

{
   "2":[
      {
         "val1":2,
         "row1":3,//ds1 row 3
         "col1":1,
         "row2":2,//ds2 row 4
         "col2":3
      },
      {
         "val1":2, 
         "row1":3,//ds1 row 3
         "col1":1,
         "row2":8,//ds2 row 8
         "col2":3
      },
      {
         "val1":2,
         "row1":10,
         "col1":1,
         "row2":2,
         "col2":3
      },
      {
         "val1":2,
         "row1":10,
         "col1":1,
         "row2":8,
         "col2":3
      }
   ],
   "7":[
      {
         "val1":7,
         "row1":6,
         "col1":1,
         "row2":3,
         "col2":3
      },
      {
         "val1":7,
         "row1":6,
         "col1":1,
         "row2":11,
         "col2":3
      }
   ],
   "8":[
      {
         "val1":8,
         "row1":7,
         "col1":1,
         "row2":4,
         "col2":3
      },
      {
         "val1":8,
         "row1":11,
         "col1":1,
         "row2":4,
         "col2":3
      }
   ],
   "9":[
      {
         "val1":9,
         "row1":5,
         "col1":1,
         "row2":7,
         "col2":3
      },
      {
         "val1":9,
         "row1":5,
         "col1":1,
         "row2":10,
         "col2":3
      }
   ],
   "pA":[//just an array of all of the matches
      2,
      9,
      7,
      8
   ]
}

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2014-01-24
    相关资源
    最近更新 更多