在同一个文档(工作簿)中,每当我创建命名范围时,我都会有类似的东西,Sheet1!A1
但它总是引用Sheet1
. 有什么方法可以让我参考当前的电子表格吗?
如果我目前在this!A1
或如果我在.Sheet1!A1
Sheet1
Sheet200!A1
Sheet200
目的是在工作簿的所有电子表格中重用相同的公式(已经有命名的间隔)。我发现这个全局和固定参考相当愚蠢。这样我总是必须为每个电子表格重新创建我的公式。
在同一个文档(工作簿)中,每当我创建命名范围时,我都会有类似的东西,Sheet1!A1
但它总是引用Sheet1
. 有什么方法可以让我参考当前的电子表格吗?
如果我目前在this!A1
或如果我在.Sheet1!A1
Sheet1
Sheet200!A1
Sheet200
目的是在工作簿的所有电子表格中重用相同的公式(已经有命名的间隔)。我发现这个全局和固定参考相当愚蠢。这样我总是必须为每个电子表格重新创建我的公式。
命名范围是指特定工作表上的特定单元格范围 - 我认为这种情况不会很快发生变化。
但是这里有一个自定义函数,您可以将其放入电子表格的脚本中,该函数将为您“本地化”范围。此代码也可在此 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));
If you now copy Sheet1 into a new Sheet2, you'll find that the formula still works, and that it performs its calculations on the data on Sheet2, even though the Named Range refers to Sheet1.