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:)