Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何使用带有过滤器的自定义函数?_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 如何使用带有过滤器的自定义函数?

Google apps script 如何使用带有过滤器的自定义函数?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我定义了一个自定义函数,用于从字符串中提取部分地址: /* * Return the number preceding 'N' in an address * '445 N 400 E' => '445' * '1083 E 500 N' => '500' */ function NorthAddress(address) { if (!address) return null; else { var North = new RegExp('([0

我定义了一个自定义函数,用于从字符串中提取部分地址:

/*
 * Return the number preceding 'N' in an address
 *    '445 N 400 E' => '445'
 *    '1083 E 500 N' => '500'
 */
function NorthAddress(address) {
  if (!address) return null;
  else {
    var North = new RegExp('([0-9]+)[\\s]+N');
    var match = address.match(North);
    if (match && match.length >= 2) {
      return match[1];
    }
    return null;
  }
}
我想将此函数用作在电子表格中调用
FILTER(…)
的条件之一,其中存储了以下地址:

=FILTER('Sheet 1'!A:A, NorthAddress('Sheet 1'!B:B) >= 450))
但是当我像这样调用
NorthAddress
时,它会得到B列中所有值的数组,我一生都找不到任何关于如何处理这些值的文档。(对我来说)最明显的方法似乎不起作用:对每个值调用
NorthAddress
遍历数组,然后返回一个结果数组


我的函数需要返回什么才能使过滤器按预期工作?

它不工作,因为如果只将一个单元格作为参数传递,则地址是字符串、范围或字符串矩阵

因此,您返回一个字符串,过滤器使用布尔数组来过滤数据,因此过滤器的条件是
string
number

返回值时,只需将字符串转换为数字

/*
 * Return the number preceding 'N' in an address
 *    '445 N 400 E' => '445'
 *    '1083 E 500 N' => '500'
 */
function NorthAddress(address) {
  if(typeof address == "string"){
    if (!address) return "#N/A";
    else {
      var North = new RegExp('([0-9]+)[\\s]+N');
      var match = address.match(North);
      if (match && match.length >= 2) {
        return parseInt(match[1]);
      }
      return "#N/A";
    }
  } else {
    var matrix = new Array();
    for(var i = 0; i<address.length; i++){
      matrix[i] = new Array();
      for(var j = 0; j<address[i].length; j++){
        var North = new RegExp('([0-9]+)[\\s]+N');
        var match = address[i][j].match(North);
        if (match && match.length >= 2) {
          matrix[i].push(parseInt(match[1]));
        }
      }
    }
    return matrix;
  }
}
/*
*返回地址中“N”前面的数字
*“445 N 400 E”=>“445”
*'1083 E 500 N'=>'500'
*/
功能地址(地址){
如果(地址类型==“字符串”){
如果(!地址)返回“#不适用”;
否则{
var North=new RegExp('([0-9]+)[\\s]+N');
var match=地址匹配(北);
if(match&&match.length>=2){
返回parseInt(匹配[1]);
}
返回“#不适用”;
}
}否则{
var矩阵=新数组();

对于(var i=0;i当调用一个自定义函数传递一个多单元格范围时,它会接收一个值矩阵(2d数组),不管范围是一列还是一行,它始终是一个矩阵。您也应该返回一个矩阵


无论如何,我不会对此使用自定义函数,因为已有本机电子表格公式:
RegexMatch
RegexExtract
RegexReplace
公式行为,只需将它们包装在
IfError
公式中。

我将添加此作为答案,因为我发现如果在未调用
toString()
时在引用的单元格或范围中传递数值,则自定义函数将返回错误:

function NorthAddress(address) {
  if (!address) return null;
  else {
    if (address.constructor == Array) {
      var result = address;
    }
    else {
      var result = [[address]];
    }
    var north = new RegExp('([0-9]+)[\\s]+N');
    var match;
    for (var i = 0; i < result.length; i++) {
      for (var j = 0; j < result[0].length; j++) {
        match = result[i][j].toString().match(north);
        if (match && match.length >= 2) {
          result[i][j] = parseInt(match[1]);
        }
        else {
          result[i][j] = null;
        }
      }
    }
    return result;
  }
}
函数地址(地址){
如果(!address)返回空值;
否则{
if(address.constructor==数组){
var结果=地址;
}
否则{
var结果=[[address]];
}
var north=new RegExp('([0-9]+)[\\s]+N');
var匹配;
对于(变量i=0;i=2){
结果[i][j]=parseInt(匹配[1]);
}
否则{
结果[i][j]=null;
}
}
}
返回结果;
}
}

例如:
=FILTER('Sheet 1'!A:A;VALUE(REGEXEXTRACT('Sheet 1'!B:B;“([0-9]+)N”)>=450)
感谢您提供的额外里程AdamL:)