18

たとえば、スプレッドシート関数を呼び出すと、int(f2)関数はセル内の値に作用します。3.14159 が含まれている場合cell("F2")、結果は 3 になります。しかし、別のタイプの関数を呼び出すと (たとえば:)、row(f8)関数は値ではなくセル参照を受け取り、この場合は 8 を返します。

カスタム関数を値ではなく参照で動作させるにはどうすればよいですか?

文字列を渡して を使用できますgetRange()が、シート上のセルを移動または更新しても、文字列は変更されません。

本当に簡単な例:

function GetFormula(cellname) {
  return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula();
}

これをシートのコードで使用すると、次のように C4 で数式を取得できます。=GetFormula("C4")

しかし、この引数は文字列なので、むしろセル参照を渡したいと思います。やや複雑な問題として、コピーして貼り付けたときに呼び出しセルを更新する必要があります。

何か案は?

4

3 に答える 3

9

(Web Apps に関する私の回答から。) 数式を含むセルであるアクティブ セルの数式を解析することで、渡された範囲への参照を取得できます。これは、カスタム関数がより複雑な式の一部としてではなく、単独で使用されることを前提として=myfunction(A1:C3)=sqrt(4+myfunction(A1:C3))ます。

=myfunction(Sheet2!A3:B5)このメソッドは、やなどの他のシートへの参照もサポートしています =myfunction('Another Sheet'!B3:G7)

デモとして、この関数は渡された範囲の最初の列インデックスを返します。このビットは関数の最後にあります。そのほとんどは範囲抽出を扱います。

function myfunction(reference) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i)[1].split('!');
  try {
    if (args.length == 1) {
      var range = sheet.getRange(args[0]);
    }
    else {
      sheet = ss.getSheetByName(args[0].replace(/'/g, ''));
      range = sheet.getRange(args[1]);
    }
  }
  catch(e) {
    throw new Error(args.join('!') + ' is not a valid range');
  }

  // everything so far was only range extraction
  // the specific logic of the function begins here

  var firstColumn = range.getColumn();  // or whatever you want to do with the range
  return firstColumn;
}
于 2016-06-22T14:12:57.880 に答える
2

私は数か月前にこれに取り組んでいましたが、非常に単純なクラッジを思いつきました: 各セルの名前を内容とする新しいシートを作成します: セル A1 は次のようになります:

= arrayformula(cell("address",a1:z500))

編集:上記は機能しなくなりました。'Ref'!A1 の新しい式は

= ArrayFormula(char(64+column(A1:Z100))&row(A1:Z100))

シートに「Ref」という名前を付けます。次に、コンテンツではなく文字列としてセルへの参照が必要な場合は、次を使用します。

= some_new_function('Ref'!C45)

もちろん、関数が文字列 (1 つのセル) または 1D または 2D 配列を渡されるかどうかを確認する必要があります。配列を取得すると、すべてのセル アドレスが文字列として含まれますが、最初のセルと幅と高さから、必要なものを把握できます。

于 2016-06-11T13:52:54.850 に答える
-2

範囲をカスタム関数に渡す場合、パラメーターのタイプはRangeであり、値のフェッチなどを使用できます。

編集:これは正しくありません。

于 2012-09-05T16:56:28.167 に答える