如何在Google Spreadsheets中引用指定范围内的当前电子表格?

时间:2013-01-09 14:23:36

标签: google-apps-script google-docs google-sheets

在同一个文档(工作簿)中,每当我创建命名范围时,我都会有类似Sheet1!A1的内容,但它总是引用Sheet1。我有什么方法可以参考当前电子表格吗?

this!A1之类的内容,如果我在Sheet1!A1Sheet1,如果我在Sheet200!A1,则会变成Sheet200

purpuse是在工作簿的所有电子表格中重用相同的公式(已经有命名的间隔)。我发现这个全球性和固定的参考文献相当愚蠢。这样我总是需要为每个电子表格重新创建公式。

1 个答案:

答案 0 :(得分:0)

命名范围是指特定工作表上特定范围的单元格 - 我不认为它会很快发生变化。

但是这里有一个自定义函数,您可以将其放入电子表格的脚本中,为您“本地化”范围。此代码也可供下载in this 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));

如果您现在将Sheet1复制到新的Sheet2中,您会发现该公式仍然有效,并且它会对Sheet2上的数据执行计算,即使命名范围指的是Sheet1。