3

文字列からアドレスの一部を抽出するカスタム関数を定義しました。

/*
 * 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(...)この関数を、これらのアドレスが保存されているスプレッドシートの呼び出しの条件の1つとして使用したいと思います。

=FILTER('Sheet 1'!A:A, NorthAddress('Sheet 1'!B:B) >= 450))

しかし、NorthAddressこのように呼び出すと、列Bのすべての値の配列が取得され、それをどのように処理する必要があるかについてのドキュメントを一生見つけることができません。(私にとって)最も明白な方法は機能していないようです。NorthAddress各値を呼び出す配列を繰り返し処理し、結果の配列を返します。

期待どおりに機能するために、関数は何を返す必要がありFILTERますか?

4

3 に答える 3

4

カスタム関数がマルチセル範囲の受け渡しと呼ばれる場合、値の行列(2次元配列)を受け取ります。範囲が単一の列であるか単一の行であるかは関係ありません。常に行列です。また、行列も返す必要があります。

RegexMatchとにかく、ネイティブのスプレッドシートの数式: 、RegexExtractおよび数式がすでに存在するため、これにカスタム関数を使用することはありませんRegexReplace。「一致する場合」の動作を取得するには、それらをIfError数式でラップするだけです。

于 2012-06-06T11:26:50.217 に答える
0

アドレスは、argとして1つのセルのみを渡す場合、文字列、範囲、文字列の行列であるため、機能しません。

したがって、文字列を返すと、FILTERはブール配列を使用してデータをフィルター処理するため、フィルターの条件は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;
  }
}

これがお役に立てば幸いです。

于 2012-06-06T11:25:35.843 に答える
0

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;
  }
}
于 2012-06-06T11:58:44.307 に答える