如何在谷歌电子表格脚本中测试范围参数的类型

How to test type of range parameter in Google Spreadsheet script?

本文关键字:范围 测试 参数 类型 脚本 谷歌 电子表格      更新时间:2023-09-26

我刚开始修改谷歌电子表格的脚本,我遇到了一个问题:

如何测试函数参数的类型是否为一系列单元格?

我想做这样的事情:

if(typeof intput != "range") {
  throw "input must be a range";
}

从谷歌的例子这里(页面中间):

if (typeof inNum != "number") {  // check to make sure input is a number
  throw "input must be a number";  // throw an exception with the error message
} 

因此,这似乎是测试变量类型的正确方法。但我不知道如何测试这种类型是否是一系列细胞。

如果我能指定范围是一维还是二维,那就更好了。

单元格范围只是一个数组(多维数组)Javascript在这方面存在问题。数组被视为一个对象。所以,首先检查你是否有"对象"类型,然后你就可以这样测试了。

if(typeof intput=="object"&&intput.length!=undefined) {
  //input is a array
}else{
  //Not a array
}

通过测试默认属性,您可以确定您有一个数组

范围可以表示单个小区(例如'A1')或一组小区(例如,'A1:A2')。

当范围作为自定义函数参数(例如=processRangeVal(A1:A2))传递时,它将被转换为范围值。

如果范围是单个单元格,则范围值只是该单元格中的数据。

如果范围是一组单元格,则范围值是二维数组。第一个维度是行,第二个维度是每行中的列。

测试表示一个单元格与一组单元格的范围值:

function processRangeVal(rangeVal) {
  if (Array.isArray(rangeVal[0])) {
    // do 2d-array handling
  } else {
    // do cell data handling
  }
} 

如果范围是单个单元格并且单元格数据不支持索引,则rangeVal[0]解析为undefined。在这种情况下,Array.isArray(undefined)解析为false,这正是我们想要的。

我知道这篇文章很老,但我有一个解决方案。

首先你需要知道这些:

  • getCell()是一个范围对象方法
  • isSheetHidden()是工作表方法
  • getSpreadsheetTme()是一个电子表格方法

现在我们将利用它:

所有特定对象类型的首次写入扩展方法:

Object.prototype.isRange = function () { return this.getCell !== undefined }
Object.prototype.isSheet = function () { return this.isSheetHidden != undefined }
Object.prototype.isSpreadsheet = function () { return this.getSpreadsheetTheme != undefined }

现在你可以测试:

function myFunction() {
  let ss = SpreadsheetApp.getActiveSpreadsheet()
  let sheet = ss.getSheetByName("FOOD_DB")
  let range = sheet.getActiveRange()
  Logger.log("range.isRange(): " + range.isRange())             //TRUE
  Logger.log("range.isSheet(): " + range.isSheet())             //false
  Logger.log("range.isSpreadsheet(): " + range.isSpreadsheet()) //false
  Logger.log("sheet.isRange(): " + sheet.isRange())             //false
  Logger.log("sheet.isSheet(): " + sheet.isSheet())             //TRUE
  Logger.log("sheet.isSpreadsheet(): " + sheet.isSpreadsheet()) //false
  Logger.log("ss.isRange(): " + ss.isRange())                   //false
  Logger.log("ss.isSheet(): " + ss.isSheet())                   //false
  Logger.log("ss.isSpreadsheet(): " + ss.isSpreadsheet())       //TRUE
}