【问题标题】:How to check if a sheet cells includes errors or not?如何检查工作表单元格是否包含错误?
【发布时间】:2020-06-05 17:40:37
【问题描述】:

我正在使用这个脚本函数来检查工作表中的单元格函数是否有任何错误。

这是代码,但它似乎不起作用。当我在单元格中有错误时,它会一直说没有错误

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sourcename = "Sheet1";
  var source = ss.getSheetByName(sourcename);

  var cell = source.getRange("A1:AG30");

function isError2(cell) { 
  const errorValues = ["#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A","#ERROR!"];
  if (errorValues.includes(cell) != true) {
  Logger.log("no error");
  } else{
    Logger.log("some error");
  }
  
}

function isError2() {  
var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sourcename = "Sheet1";
      var source = ss.getSheetByName(sourcename);

      var cell = source.getRange("A1:AG30");
      const errorValues = ["#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A","#ERROR!"];
      if (errorValues.includes(cell) != true) {
      Logger.log("no error");
      } else{
        Logger.log("some error");
      }

    }

更新了方法,但仍然无法获得所需的输出

var mysheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
 var sheet1 = SpreadsheetApp.setActiveSheet(mysheet);

function findErrors(sheet) {
   const errorValues = ["#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A","#ERROR!"];
    
  var singleSheetArray = [];

  var name = sheet1.getName();
   
  // how many cells in the sheet currently
  var maxRows = sheet1.getMaxRows();
  var maxCols = sheet1.getMaxColumns();
  
  var totalCells = maxRows * maxCols;
  
  // how many cells have data in them
  var r = sheet1.getLastRow();
  var c = sheet1.getLastColumn();
  var data_counter = r * c;
  
  if (data_counter !== 0) {
  
    var dataRange = sheet1.getRange(1,1,r,c);
    var dataValues = dataRange.getValues();

    dataValues.forEach(function(row) {
      row.forEach(function(cell) {
        if ((errorValues.indexOf(cell) === -1) )  {
           SpreadsheetApp.getUi().alert("no errors in "+cell);          
          data_counter --;
        } 
          
      });
    });  
  }
}

【问题讨论】:

  • 将警报更改为alert("no errors in "+cell); 并在单元格出现错误时显示屏幕截图,但仍显示没有错误。
  • 它应该显示“#ERROR 中没有错误”或类似的内容,以证明您声称它在错误单元格中没有显示错误。

标签: javascript google-apps-script google-sheets custom-function


【解决方案1】:

问题

无法检查单元格是否有错误

说明

您面临的问题是简单的类型不匹配。 getRange() 方法返回一个Range 的实例,而您尝试将它与errorValues 数组的成员进行比较,该数组由字符串 组成。因此,errorValues.includes(cell) 将始终为false,因此条件语句的第一个块执行。

解决方案

在范围上使用getValues(),它将返回一个二维值数组。如果您只对一行感兴趣(您可能对这一行感兴趣),请将其提取并使用some(或every)方法遍历单元格,进行相同的比较。

备注

  1. 关于在自定义函数和一般 GAS 中使用全局变量。你可以使用它们,GAS 环境是一个带有便利层的 JavaScript 运行时,它简化了使用 Google API 的工作,几乎所有在 JS 中有效的东西在这里都有效。话虽如此,请务必将全局变量视为不存在 - 除非您确切知道自己在做什么。

参考文献

  1. getRange 方法 reference
  2. getValues 方法 reference
  3. 自定义函数guide
  4. every 方法 reference 在 MDN 上(见 some 那里)

【讨论】:

  • 嗨@Oleg Valter 谢谢你的所有解释,绝对帮助我理解这个概念。一件事是我对一行或一列不感兴趣。我在单元格中有多个行和列的函数,这就是我使用范围的原因。话虽如此,我只是尝试了 getValues 并且仍然将 false 作为返回值。 var cell = source.getRange("A1:AG30").getValues();
  • 是的,正如你应该的那样 - 你刚刚用 Range 实例替换了一个数组实例 :) 请看一下 everysome 方法以及输出的结构getValues() 返回的是 - 每个顶级成员代表一行,每一行是一个由值组成的数组 - 您要比较的是后者
  • 只是为了澄清一下,这就是您所指的,因为我刚刚尝试过,但仍然没有运气? var cell = source.getRange(1,1,30,30).getValues();
  • 正确,对于那个 - 这样做只是第一步 - 请参阅答案的第二部分并阅读用于循环数组的方法 - 如果你想检查 none 的单元格有问题,然后使用嵌套的every 方法调用来实现。
  • 嗨@Oleg Valter 根据您的建议,我尝试研究每一个但很难理解如何在函数中调整方法。我正在以不同的方式尝试循环,但我遵循了您的建议。刚刚发布了更新的代码,但仍然无法获得所需的结果,如果没有错误,我可以简单地触发一个简单的警报,如果有错误,我想触发一个警报,说有错误。任何帮助将不胜感激。
【解决方案2】:

尝试在函数中移动 4 个变量。 Apps 脚本不支持全局变量。因此该函数无法识别 var 单元格。

编辑:Detect formula errors in Google Sheets using Script

【讨论】:

  • 嗨@RemcoE33 那么我的函数应该是什么样子,因为单元格是在函数定义中定义的 --> function isError2(cell)
  • 嗨@RemcoE33我已经更新了代码中的函数,在这里,仍然没有运气......同样的问题......它总是返回“false”值--> errorValues.includes(cell)
  • 嗨@RemcoE33,如果您看到我的代码非常相似,那是我最初获得代码的地方,但正如我所提到的,它并没有让我得到想要的结果。任何帮助,将不胜感激。谢谢
  • 嗨@RemcoE33 - 不幸的是,Apps 脚本不支持全局变量 的说法根本不正确且具有误导性。您可以通过创建一个正确引用全局变量的自定义函数来检查。
  • @RemcoE33 - 也就是说,我必须道歉并调整我之前的陈述,只是要求您更具体地回答您使用全局变量的含义。我看到 OP 删除了问题的第一个版本 [这是一个不好的做法],就目前而言,它会让人们认为你说 global vars 作为在全局范围内定义的变量的定义明确的术语是不支持
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多