Google Script检查一张纸上一列中的数据是否与另一张纸中的另一列相同

时间:2017-12-14 11:31:54

标签: google-apps-script google-sheets

我正在尝试创建一个Google脚本来检查一张纸上一列中的数据是否与另一张纸上的另一列相同,我想出错的任何想法?

由于 :) 代码如下:

function myFunction() {
  //data from Salesworks
  var sheet = SpreadsheetApp.getActive().getSheetByName("Sales Works TEST");
  var data_salesworks = sheet.getRange('D3:D121').getValues();

  //data from Google Form
  var sheet = SpreadsheetApp.getActive().getSheetByName("V3 New Form Responses");
  var data_sheet = sheet.getRange('N3:N121').getValues();


  if (data_salesworks = data_sheet){
    Browser.msgBox('Date Range Correct');
  }
    else{
      Browser.msgBox('Date Range Incorrect');
}
}

2 个答案:

答案 0 :(得分:1)

使用getValues()检索值时,值为2维数组。不幸的是,不能直接比较这种阵列。因此需要修改比较部分。我想针对这种情况提出以下两种模式。

模式1:

在此模式中,每个数组都转换为字符串并进行比较。

function myFunction() {
  //data from Salesworks
  var sheet = SpreadsheetApp.getActive().getSheetByName("Sales Works TEST");
  var data_salesworks = sheet.getRange('D3:D121').getValues();
  //data from Google Form
  var sheet = SpreadsheetApp.getActive().getSheetByName("V3 New Form Responses");
  var data_sheet = sheet.getRange('N3:N121').getValues();
  if (data_salesworks.toString() == data_sheet.toString()) {
    Browser.msgBox('Date Range Correct');
  } else {
    Browser.msgBox('Date Range Incorrect');
  }
}

模式2:

在此模式中,使用“for loop”比较每个数组中的所有元素。

function myFunction() {
  //data from Salesworks
  var sheet = SpreadsheetApp.getActive().getSheetByName("Sales Works TEST");
  var data_salesworks = sheet.getRange('D3:D121').getValues();
  //data from Google Form
  var sheet = SpreadsheetApp.getActive().getSheetByName("V3 New Form Responses");
  var data_sheet = sheet.getRange('N3:N121').getValues();
  var f = true;
  for (var i=0; i<data_salesworks.length; i++) {
    for (var j=0; j<data_salesworks[i].length; j++) {
      if (data_salesworks[i][j] != data_sheet[i][j]) {
        f = false;
      }
    }
  }
  if (f) {
    Browser.msgBox('Date Range Correct');
  } else {
    Browser.msgBox('Date Range Incorrect');
  }
}

注意:

这些样品必须满足以下条件。

  • 两个比较数据的行数相同。
  • 两个比较数据的列数相同。

参考:

如果我对你的问题的理解是错误的,请告诉我。我想修改它。

答案 1 :(得分:0)

简短回答

  

......我在哪里做错了?

脚本中的一个错误在data_salesworks = data_sheet上,因为单个=用于将对象分配给变量。另一个错误是假设可以直接比较数组。

扩展答案

Google Apps脚本基于JavaScript。

getValues()返回一个二维数组,根据单元格的值和类型,每个成员都是一个JavaScript原始对象,换句话说,getValues()可以返回一个包含字符串,日期,数字和布尔值组合的数组。

在JavaScript上,直接比较两个数组并不起作用。有关详细信息,请参阅How to compare arrays in JavaScript?

考虑到上述情况,为了比较两个Google电子表格范围,首先我们可以比较范围大小是否相等,如果是,则比较第一个2D数组的每个innerst成员与第二个2D数组的相应成员。

在JavaScript上有两个相等运算符,抽象相等运算符==和严格相等运算符===。我们应该使用严格相等运算符来区分'2(数字2为字符串)与2(数字2为数字)之类的内容。

示例:

以下脚本包含两个功能。第一个设置要比较的电子表格范围的地址,第二个进行比较。

限制:此脚本不会比较单元格和内容格式,注释和数据验证,只是比较值。

function test(){
  var address1 = 'A1:A3';
  var address2 = 'B1:B3';
  var output = compareRanges(address1,address2);
  Logger.log(output);

}

function compareRanges(address1,address2){
  var sheet = SpreadsheetApp.getActiveSheet();
  var values1 = sheet.getRange(address1).getValues();
  var values2 = sheet.getRange(address2).getValues();
  if(values1.length === values2.length && values1[0].length === values2[0].length) {
    for(var i = 0; i < values1.length; i++){
      for(var j = 0; j < values2.length; j++){
        if(values1[i][j] !== values2[i][j]) {
          return false;
        }
      }
    }
  } else {
    return false;
  }
  return true;
}