【问题标题】:Google Script checking that the data within one column on one sheet is the same as another column in another sheet谷歌脚本检查一张纸上一列中的数据是否与另一张纸上的另一列相同
【发布时间】:2017-12-14 11:31:53
【问题描述】:

我正在尝试创建一个 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');
}
}

【问题讨论】:

  • 我的回答对您有用吗?如果您对我的回答有疑问,请随时告诉我。我想学习解决你的问题。

标签: google-apps-script google-sheets


【解决方案1】:

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

模式一:

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

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

模式二:

在这种模式中,每个数组中的所有元素都使用“for循环”进行比较。

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

注意:

这些样本需要满足以下条件。

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

参考:

如果我对您的问题的理解有误,请告诉我。我想修改它。

【讨论】:

    【解决方案2】:

    简答

    ...我哪里做错了?

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

    扩展答案

    Google Apps 脚本基于 JavaScript。

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

    在 JavaScript 上,直接比较两个数组是行不通的。更多详情见How to compare arrays in JavaScript?

    考虑到上述情况,要比较两个 Google 电子表格范围,首先我们可以比较范围大小是否相等,如果相等,则将第一个二维数组的每个内部成员与第二个二维数组的对应成员进行比较。

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

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多