是否有 Google 表格公式可以将表格名称放入单元格中?
Posted
技术标签:
【中文标题】是否有 Google 表格公式可以将表格名称放入单元格中?【英文标题】:Is there a Google Sheets formula to put the name of the sheet into a cell? 【发布时间】:2018-01-12 03:22:32 【问题描述】:下面的插图应该会有所帮助:
【问题讨论】:
【参考方案1】:你有两个选择,我不确定我是否是其中任何一个的粉丝,但这是我的看法。你可能会有不同的感受:
选项 1:强制函数运行。
除非引用已更改的单元格,否则单元格中的函数不会运行。更改工作表名称不会触发电子表格中的任何功能。但是我们可以通过向它传递一个范围来强制函数运行,只要该范围内的项目发生变化,函数就会触发。
您可以使用以下脚本创建一个自定义函数来检索名称:
function mySheetName()
var key = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
return key;
并在单元格中放置以下内容:
=mySheetName(A1:Z)
现在,如果该传递范围内的单元格中的任何值发生更改,脚本将运行。这需要一秒钟来运行脚本并在每次更改任何值时在单元格中设置一条消息,因此这可能会很快变得烦人。如前所述,它还需要更改范围才能触发它,因此对于相当静态的文件并没有真正的帮助。
选项 2:使用 OnChange 事件
虽然运行时间感觉比上面的选项好,而且这不依赖于电子表格单元格中的值变化,但我不喜欢这样,因为它会强制名称去哪里。如果您愿意,可以使用实用程序表在各种表中定义此位置。以下是基本想法,如果您喜欢此选项,可能会帮助您入门。
当工作表名称改变时触发 OnChange 事件。您可以使下面的代码更复杂以检查错误,检查工作表 ID 以仅在给定工作表上工作等。但是,基本代码是:
function setSheetName(e)
var key = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('K1').setValue(key);
保存代码后,在脚本编辑器中将 Current Project 的 On Change Trigger 设置为此函数。它将在任何更改事件上将工作表名称写入单元格 K1。要设置触发器,请选择编辑菜单下的Current project's triggers。
【讨论】:
"工作表名称更改时触发 OnChange 事件。"不幸的是,情况似乎不再如此。或者,在我的情况下,这没有发生,尽管如果工作表中的任何单元格被更新,该函数确实有效,当然。这可能已经足够好了,所以无论如何我都很感激这个答案。【参考方案2】:这是我在 Google 表格中找到的:
要在 Google 表格中获取当前表格名称,以下简单脚本可以帮助您,无需手动输入名称,请按以下方式操作:
单击工具 > 脚本编辑器
在打开的项目窗口中,将以下脚本代码复制并粘贴到空白代码窗口中,见截图:
......................
function sheetName()
return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
然后保存代码窗口,回到你要取名字的工作表,然后在单元格中输入这个公式:=sheetName()
,然后按回车键,工作表名字就会立刻显示出来。
查看此链接并添加截图:https://www.extendoffice.com/documents/excel/5222-google-sheets-get-list-of-sheets.html
【讨论】:
很好的答案。这也适用于打印其他未激活的工作表 - 因此您也不必担心。 这里需要注意的是,如果您更改工作表名称,公式将无法正确重新计算:( 您的函数名称与您的公式不符。一个是骆驼壳的,一个不是。公式需要为 =sheetName() 或您的函数需要重命名为 'sheetname' @turtlepower 虽然在大小写方面保持名称同步很好,但它实际上并不影响此处公式的功能。它会很好地匹配脚本。 哇哦!谢谢。【参考方案3】:如果您从另一个工作表中引用该工作表,您可以使用 CELL 函数获取工作表名称。然后,您可以使用正则表达式提取工作表名称。
=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
更新: 该公式将根据未来的更改自动更新“工作表名称”,但您需要在最初输入公式时引用该工作表上的一个单元格(例如 A1)。
【讨论】:
缺乏解释@JohnP2 这正是我所寻找的。谢谢你。如果我以这种方式输入工作表名称,并更新工作表名称,则此公式会自动更新以获取新的工作表名称。 即使公式中的工作表名称自动更新,结果值也不会。即使使用“每分钟重新计算”,也没有任何反应(是的,我使用NOW
函数进行了检查——只有每分钟更新一次,而工作表名称没有)。 (卢克的回答继续评论)
喜欢这个解决方案。【参考方案4】:
这是我对一个脚本的提议,该脚本从参数中的工作表列表中的位置返回工作表的名称。如果不提供参数,则返回当前工作表名称。
function sheetName(idx)
if (!idx)
return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
else
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var idx = parseInt(idx);
if (isNaN(idx) || idx < 1 || sheets.length < idx)
throw "Invalid parameter (it should be a number from 0 to "+sheets.length+")";
return sheets[idx-1].getName();
然后你可以像任何函数一样在单元格中使用它
=sheetName() // display current sheet name
=sheetName(1) // display first sheet name
=sheetName(5) // display 5th sheet name
如其他答案所述,您需要将此代码添加到脚本中:
Tools > Script editor
【讨论】:
绝对惊人的解决方案,正是我想要的!非常感谢!【参考方案5】:我有一张供其他人使用的工作表,并且我周围有很多间接()引用,所以我需要公式化地处理更改的工作表选项卡名称。
我使用了来自 JohnP2(如下)的公式,但遇到了问题,因为当工作表名称更改时它没有自动更新。您需要转到实际公式,进行任意更改并刷新以再次运行它。
=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
我使用this solution 中关于如何强制刷新函数的信息解决了这个问题。它可能不是最优雅的解决方案,但它迫使表格关注此单元格并定期更新它,以便捕获更新的表格标题。
=IF(TODAY()=TODAY(), REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1"), "")
使用此功能,表格知道每次您进行更改时都会刷新此单元格,这会导致地址在用户重命名时更新。
【讨论】:
第二个 sn-p 比 JohnP2 的答案好一点,但它仍然不会完全自动更新工作表名称。更改工作表名称后,我必须强制工作表中的任何单元格重新计算(通过编辑带有更改的单元格)。我还可以将重新计算设置更改为“每分钟”,这也将起作用,在分钟标记处更新工作表名称。 我同意,我的公式曾经有效 - 但这里有一点值得了解:我的 INDIRECT 公式不再需要更新的工作表名称!幕后的 Google 表格会记住旧的表格名称。 INDIRECT 公式仍然有效。 我也刚刚发现,如果删除单个引用的单元格,公式就会中断。我引用了整张表'SHEET NAME'!1:25
,问题似乎已经解决。只要任何范围仍然存在,公式就会继续有效。【参考方案6】:
我终于在不使用脚本的情况下以半自动方式工作......但它确实需要 3 个单元来完成它。从以前的答案中借用一点,我从一个只有 =NOW() 的单元格开始显示时间。例如,我们将其放入单元格 A1...
=NOW()
此功能每分钟自动更新。在下一个单元格中,使用工作表自己的名称放置一个指针公式以指向上一个单元格。例如,我们将其放入 A2...
='Sheet Name'!A1
除了单元格格式之外,单元格 A1 和 A2 此时应该显示相同的内容...即当前时间。
而且,最后一个单元格是我从以前的解决方案中借用的部分,使用正则表达式从第二个单元格中提取公式,然后从所述公式中删除工作表的名称。例如,我们将其放入单元格 A3...
=REGEXREPLACE(FORMULATEXT(A2),"='?([^']+)'?!.*","$1")
此时,A3中显示的结果值应该是工作表的名称。
根据我的经验,只要更改工作表的名称,A2 中的公式就会立即更新。然而,这还不足以触发 A3 更新。但是,当单元格 A1 重新计算时间的每一分钟,单元格 A2 中的公式结果随后会更新,然后又会触发 A3 使用新的工作表名称进行更新。这不是一个紧凑的解决方案......但它似乎确实有效。
【讨论】:
我在玩过这个解决方案后发现的一件事是,如果您的工作表名称中包含单引号,则正则表达式不起作用。例如,假设您有“Joe's Sheet”作为名称,joe 之后的撇号会搞砸表达式。我对正则表达式不是很精通......所以也许其他人可以提出一个合适的修订来处理这些问题。 令人抓狂的是,谷歌让这么简单的事情变得如此困难。 这绝对是最好的解决方案!至少对我来说。【参考方案7】:一个旧线程,但一个有用的......所以这里有一些额外的代码。
首先,为了回应 Craig 关于正则表达式过于贪婪并且对于包含单引号的工作表名称失败的观点,这应该可以解决问题(将 'SHEETNAME'!A1 替换为您自己的工作表和单元格引用):
=IF(TODAY()=TODAY(), SUBSTITUTE(REGEXREPLACE(CELL("address",'SHEETNAME'!A1),"'?(.+?)'?!\$.*","$1"),"''","'", ""), "")
它使用惰性匹配(“.+?”)来查找字符串(包括双引号),该字符串可能会或可能不会被 squotes 括起来,但肯定会以 bang Dollar ("!$") 结尾,后跟任何字符数。 Google 表格实际上通过附加另一个 squote(如 '')来保护工作表名称中的 squotes,因此需要 SUBSTITUTE 将它们减少为单个 squotes。
该公式还允许包含 bang ("!") 的工作表名称,但对于使用 bang 美元 ("!$") 的名称将失败 - 如果您确实需要使工作表名称看起来像完整的绝对单元格引用然后在 bang 和美元之间放置一个分隔符(例如空格)。
请注意,当指向与公式所在的不同的工作表时,它只有才能正常工作!这是因为 CELL("address" 在同一张工作表上使用时仅返回单元格引用(而不是工作表名称)。如果您需要一张工作表来显示自己的名称,然后将公式放在另一张工作表的单元格中,请将其指向你的目标表,然后从目标表中引用公式单元格。我的工作簿中经常有一个“元”表来保存设置、常用值、数据库匹配条件等,所以这也是我放置这个公式的地方。
正如其他人在上面多次说过的那样,如果您将工作簿的重新计算设置为“文件|设置|计算”菜单中的“每分钟更改时”,Google 表格只会注意到工作表名称的更改。获取更改可能需要整整一分钟。
其次,如果您像我一样碰巧需要一个可在 Google 表格和 Excel 上使用的可互操作公式(对于旧版本,至少没有 REGEXREPLACE 功能),请尝试:
=IF(IFERROR(INFO("release"), 0)=0, IF(TODAY()=TODAY(), SUBSTITUTE(REGEXREPLACE(CELL("address",'SHEETNAME'!A1),"'?(.+?)'?!\$.*","$1"),"''","'", ""), ""), MID(CELL("filename",'SHEETNAME'!A1),FIND("]",CELL("filename",'SHEETNAME'!A1))+1,255))
这使用 INFO("release") 来确定我们在哪个平台上... Excel 返回一个数字 >0 而 Google Sheets 没有实现 INFO 函数并生成一个错误,公式陷入 0 并用于数值比较。谷歌代码分支如上。
为清楚和完整起见,这是仅 Excel 版本(确实正确返回其所在工作表的名称):
=MID(CELL("filename",'SHEETNAME'!A1),FIND("]",CELL("filename",'SHEETNAME'!A1))+1,255)
它在 CELL("filename" 的输出中查找“]”文件名终止符,并使用 MID 函数从字符串的剩余部分中提取工作表名称。Excel 不允许工作表名称包含“]”所以这适用于所有可能的工作表名称。在可互操作的版本中,Excel 很高兴收到对不存在的 REGEXREPLACE 函数的调用,因为它永远不会执行 Google 代码分支。
【讨论】:
当工作表名称包含西里尔字符时,用单引号括起来。此公式将它们删除,当提取的工作表名称用于 INDIRECT() 函数时会导致问题。 用"'" & .... & "'"
括起来的公式解决了这个问题,并且适用于拉丁字符和非拉丁字符【参考方案8】:
不使用脚本:
我想我找到了一个使用=cell()
和帮助表的愚蠢解决方法。从而避免自定义函数和应用脚本。
=cell("address",[reference])
将为您提供指向所引用单元格地址的字符串引用(即“$A$1”)。问题是它不会提供工作表参考除非单元格在不同的工作表中!
所以:
在哪里
这也适用于命名工作表。然后通过各种方式调整以适用于您的用例。
来源:https://docs.google.com/spreadsheets/d/1_iTD6if3Br6nV5Bn5vd0E0xRCKcXhJLZOQqkuSWvDtE/edit#gid=1898848593
编辑:
我在文档中添加了另一个解决方法,它使用了=formulatext()
和一些传统的文本功能。通过使用其完整地址(即Sheet1A1
)引用当前工作表中的单元格,您可以使用 formulatext() 仅提取工作表名称。
【讨论】:
好点。无论如何,可能不应该用特殊字符命名工作表。在将东西连接在一起时,使用空间已经在推动它。【参考方案9】:如果你想使用内置函数:
=REGEXEXTRACT(cell("address";'Sheet1'!A1);"^'(.*)'!\$A\$1$")
说明:
cell("address";'Sheet1'!A1)
给你工作表的地址,输出是'Sheet1'!$A$1
。现在我们需要从这个输出中提取实际的工作表名称。我正在使用REGEXEXTRACT 通过正则表达式^'(.*)'!\$A\$1$
匹配它,但您可以使用更多/更少特定的正则表达式或使用SUBSTITUTE 或REPLACE 等函数
【讨论】:
以上是关于是否有 Google 表格公式可以将表格名称放入单元格中?的主要内容,如果未能解决你的问题,请参考以下文章
将“分页符”添加到 Google 表格或动态 x 行数的公式