【问题标题】:Find matches for two columns on two sheets google script在两张纸上查找两列的匹配项谷歌脚本
【发布时间】:2019-07-20 05:46:38
【问题描述】:

我正在尝试将 sheet1 中的 2 列 (A:B) 与 sheet2 (A:B) 中的 2 列进行匹配,如果匹配,请将 sheet1 中匹配行的 C 列内容复制到 sheet2 中的匹配行。

我尝试改编几个脚本,但均未成功。下面的代码最接近我的要求,但由于我对脚本的了解有限,我无法根据我的确切需求对其进行调整。

Sheet1
A       B               C
Week    Rotation    Working
Week1   11          In
Week1   5           In
Week1   4           In
Week1   3           In
Week1   3           Off
Week1   7           Off

Sheet2
A       B               C
Week    Rotation    Working
Week1   6
Week1   5
Week1   4
Week1   3
Week1   3
Week1   11              (In should be copied to here)         

我的代码:

function MatchColumns(){
  // gets spreadsheet A and the range of data
  var sheetA 
=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Testa");
  var dataA = sheetA.getRange(2, 1, sheetA.getLastRow(), 
2).getValues();

   // gets spreadsheet B and the range of data
  var sheetB = 
 SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test2");
  var dataB = sheetB.getRange(2, 1, sheetB.getLastRow(), 
 1).getValues();

  // Added
  var res = [];
  for (var b in dataB) {
    for (var a in dataA) {
       if (dataA[a][0] == dataB[b][0]) res.push([dataA[a][3]]);
     }
     if (b != res.length - 1) res.push([""]);
   }
   sheetB.getRange(2, 2, res.length, res[0].length).setValues(res);

【问题讨论】:

  • 您可以使用公式获得相同的结果。例如,在 Sheet1 上,您可以将列 D 中的 A 列和 B 列中的值组合起来。然后从 Sheet2 中查找该组合值。我会使用像“Week1-11”这样的分隔符,以便与“Week11-1”区分开来。
  • 谢谢,非常有帮助,我陷入了困境。不同的视角达到同样的效果。

标签: google-apps-script google-sheets


【解决方案1】:
  1. 请注意,JavaScript 是使用 0 基索引的众多语言之一。所以res.push([dataA[a][3]]) 将行中的第 4 个值放入结果数组,即 D 列。

  2. 您的 dataAdataB 变量实际上不包括 C 列数据,因为您仅使用 2 列数据初始化它们。所以dataA[a][2]dataA[a][3] 都是undefined

  3. 您可能不想通过push 将这些新值收集到一个数组中,因为这将失去您在 A 和 B 中匹配的行与您写入的行之间的相关性。为避免丢失 C 列中的现有信息,您需要从表 2 中读取它并分配给特定索引:

var destC = sheet2.getRange(2, 3, sheet2.getLastRow() - 1, 1).getValues();
/** Find matched rows */
   ...
  destC[b][0] = dataA[a][2];
 ...
// Lastly, write values
sheet2.getRange(2, 3, destC.length, 1).setValues(destC);

【讨论】:

    【解决方案2】:

    尝试使用嵌套的 for 遍历 Sheet1 和 Sheet2 中的值并将它们与

    function MatchColumns(){
      // gets spreadsheet A and the range of data
      var sheetA = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      var dataA = sheetA.getRange(2, 1, sheetA.getLastRow() - 1, 2).getValues();
    
      // gets spreadsheet B and the range of data
      var sheetB = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
      var dataB = sheetB.getRange(2, 1, sheetB.getLastRow() - 1, 2).getValues();
    
      for (var x = 0; x < sheetA.getLastRow() - 1; x++){
        for (var y = 0; y < sheetB.getLastRow() - 1; y++){
          if (dataA[x][0] == dataB[y][0]){
            if (dataA[x][1] == dataB[y][1]){
              sheetB.getRange(y + 2, 3).setValue(sheetA.getRange(x + 2, 3).getValue());
            }
          }
        }    
      }
    }
    
    

    如果列和 B 中的相应单元格匹配,这会将 Sheet1 中 C 列的值复制到 Sheet2 中 C 列。

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多