想要通过应用程序脚本与两个不同的Google电子表格中显示的每个单元格的值进行比较,但会出错

时间:2018-02-20 01:37:25

标签: google-apps-script google-sheets

我希望通过应用程序脚本与两个不同的谷歌电子表格中的每个单元格的值进行比较,并更改单元格的背景颜色以显示单元格已更新但我得到的是 “无法从undefined中读取属性”0.0“。(第16行,文件”代码“)” 我试过opensheetbyname nd得到它的范围仍然没有工作。谷歌搜索此错误没有找到解决方案 这是我的代码

function myFunction() {
      var sheet1 = SpreadsheetApp.openById("1-l21-
      2B7KZ5sBaRh9kmUFOyeDyP1Pnp1_IqhVlAJJR0");

      var lastRow = sheet1.getSheetByName("Sheet1").getLastRow();
      var lastCol = sheet1.getSheetByName("Sheet1").getLastColumn();
      var data = sheet1.getDataRange().getValues();

      var sheet2 = 
      SpreadsheetApp.openById("1YOQjiHZXg86XGmFZ0d5noOoLdowc_JFn3wGjICymi_o");

      var lastRow2 = sheet2.getSheetByName("Sheet1").getLastRow();
      var lastCol2 = sheet2.getSheetByName("Sheet1").getLastColumn();
      var data2 = sheet2.getDataRange().getValues();

      for(i = 0; i<=lastRow2; i++){
        for(j = 0; j<=lastCol2; j++){
         if(data[i][j] != data2[i][j]){
           sheet1.getActiveCell().setBackground("#FFFF00");
           }
          }
         }
        }

更新代码

function myFunction() {
  var sheet1 = SpreadsheetApp.openById("1Ibyd4QbrAhLMSD_GjIQYEwGCYrbtNTbMKF7vRA-Rc9Q").getSheetByName("Sheet1");

  var lastRow = sheet1.getLastRow();
  var lastCol = sheet1.getLastColumn();
  var data = sheet1.getDataRange().getValues();

  var sheet2 = 
  SpreadsheetApp.openById("1YOQjiHZXg86XGmFZ0d5noOoLdowc_JFn3wGjICymi_o");

  var lastRow2 = sheet2.getSheetByName("Sheet1").getLastRow();
  var lastCol2 = sheet2.getSheetByName("Sheet1").getLastColumn();
  var data2 = sheet2.getDataRange().getValues();

  for(i = 3; i<lastRow2; i++){
    for(j = 1; j<lastCol2; j++){
     if(data[i][j] != data2[i][j]){
       sheet1.getRange(i + 1, j + 1).setBackground("#FFFF00");
       }
      }
     }
    }

此外,我已设置编辑触发器以使其正常工作

Actual Sheet

After Code Execution Sheet

Desired Result

1 个答案:

答案 0 :(得分:0)

datadata2是二维数组。另一方面,在您的情况下,lastRow2lastCol2表示data2数组的长度。这样,当for循环的ij到达lastRow2lastCol2时,就会发生错误。那么这个修改怎么样?

来自:

for(i = 0; i<=lastRow2; i++){
  for(j = 0; j<=lastCol2; j++){

致:

for(i = 0; i < lastRow2; i++){
  for(j = 0; j < lastCol2; j++){

注意:

  • 在您的情况下,datadata2必须与数组的长度相同。请小心。

如果此修改不起作用,您能否向我们展示您的样品表?我认为这将有助于思考解决方案。如果我误解了你的问题,我很抱歉。

编辑1:

有2个部分需要修改。在这些修改中,sheet1假设原始工作表。请修改如下。请输入原始纸张的纸张名称。

1

来自:
var sheet1 = SpreadsheetApp.openById("1-l21-2B7KZ5sBaRh9kmUFOyeDyP1Pnp1_IqhVlAJJR0");
至 :
var sheet1 = SpreadsheetApp.openById("1-l21-2B7KZ5sBaRh9kmUFOyeDyP1Pnp1_IqhVlAJJR0").getSheetByName("### sheet name of original sheet ###");

2

来自:
sheet1.getActiveCell().setBackground("#FFFF00");
至 :
sheet1.getRange(i + 1, j + 1).setBackground("#FFFF00");

编辑2:

function myFunction() {
  var sheet1 = SpreadsheetApp.openById("1Ibyd4QbrAhLMSD_GjIQYEwGCYrbtNTbMKF7vRA-Rc9Q").getSheetByName("Sheet1");
  var lastRow = sheet1.getLastRow();
  var lastCol = sheet1.getLastColumn();
  var data = sheet1.getDataRange().getDisplayValues(); // Modified
  var sheet2 = SpreadsheetApp.openById("1YOQjiHZXg86XGmFZ0d5noOoLdowc_JFn3wGjICymi_o");
  var lastRow2 = sheet2.getSheetByName("Sheet1").getLastRow();
  var lastCol2 = sheet2.getSheetByName("Sheet1").getLastColumn();
  var data2 = sheet2.getDataRange().getDisplayValues(); // Modified
  for(i = 3; i<lastRow2; i++){
    for(j = 1; j<lastCol2; j++){
      if(data[i][j] != data2[i][j]){
        sheet1.getRange(i + 1, j + 1).setBackground("#FFFF00");
      }
    }
  }
}