2

同じドキュメント (ワークブック) 内で、名前付き範囲を作成するたびに、次のようなものSheet1!A1がありますが、常に参照していSheet1ます。代わりに現在のスプレッドシートを参照できる方法はありますか?

私が現在いる場合、または私がいる場合は、のようなthis!A1ものになります。Sheet1!A1Sheet1Sheet200!A1Sheet200

目的は、ワークブックのすべてのスプレッドシートで同じ数式を再利用することです (名前付きの間隔が既にあります)。このグローバルで固定された参照はかなりばかげていることがわかりました。このように、スプレッドシートごとに数式を常に再作成する必要があります。

4

1 に答える 1

0

名前付き範囲は、特定のシート上の特定のセル範囲を参照します。これがすぐに変更されることはありません。

しかし、これはスプレッドシートのスクリプトに入れることができるカスタム関数で、範囲を「ローカライズ」します。このコードは、この Gistからダウンロードすることもできます。

/*
 * Return a string with the A1 notation for the given range, with
 * the sheet reference removed. To use in spreadsheet functions,
 * enclose with INDIRECT().
 *
 * Example: 
 *   =index(INDIRECT(localizeNamedRange(NamedRange1)),12,4)
 *
 * @param {string} rangeName  The name of an existing range in the
 *                        active spreadsheet. It does not matter which
 *                        sheet the range was defined for.
 *
 * @return {string}       The cell range from the provided rangeName,
 *                        in A1 notation.
 */
function localizeNamedRange( rangeName ) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();

  // Get range by name
  var origRange = sheet.getRangeByName(rangeName);

  // Get notation for the range, without sheet reference.
  var notation = "";
  if (origRange !== null) {
    notation = origRange.getA1Notation();
  }

  // Return range in A1 notation
  debugger;   // pause to examine if running in debugger
  return ( notation );
}

例を次に示します。NamedRange1 は「Sheet1!A10:A22」として定義されています。=localizeNamedRange(NamedRange1)セルを入力すると、 への参照なしで が返されA10:A22ますSheet1。これは文字列なので、範囲が必要な数式で使用する場合は、変換する必要があります。変換を行うには、組み込み関数を使用しますINDIRECT()

Sheet1 のセル A3 には、NamedRange1 の平均値を計算する数式があります。その数式を定義してローカライズ可能にする方法は次のとおりです。

(A3) =AVERAGE(INDIRECT(localizeNamedRange(NamedRange1));

ここでシート 1 を新しいシート 2 にコピーすると、名前付き範囲がシート 1 を参照している場合でも、数式が引き続き機能し、シート 2 のデータに対して計算が実行されることがわかります。

于 2013-01-11T21:58:10.880 に答える