小智 25
这是我在Google表格中找到的内容:
要获取Google表格中的当前表格名称,以下简单脚本可以为您提供帮助,而无需手动输入名称,请按以下步骤操作:
单击工具>脚本编辑器
在打开的项目窗口中,将以下脚本代码复制并粘贴到空白的“代码”窗口中,请参见屏幕截图:
......................
function sheetName() {
return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
}
Run Code Online (Sandbox Code Playgroud)
然后保存代码窗口,并返回到要获取其名称的工作表,然后输入以下公式:=sheetName()
在单元格中,然后按Enter键,工作表名称将立即显示。
看到此链接并添加了屏幕截图:https : //www.extendoffice.com/documents/excel/5222-google-sheets-get-list-of-sheets.html
Kar*_*l_S 13
你有2个选择,我不确定我是否喜欢他们,但这是我的看法.您可能会有不同的感受
选项1:强制运行该功能.
除非它引用已更改的单元格,否则单元格中的函数不会运行.更改工作表名称不会触发电子表格中的任何功能.但是我们可以通过向其传递一个范围来强制执行该函数,并且只要该范围内的项发生更改,该函数就会触发.
您可以使用以下脚本创建将检索名称的自定义函数:
function mySheetName() {
var key = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
return key;
}
Run Code Online (Sandbox Code Playgroud)
并在单元格中放置以下内容:
=mySheetName(A1:Z)
Run Code Online (Sandbox Code Playgroud)
现在,如果该传递范围中的单元格中的任何值发生更改,则脚本将运行.这需要一秒钟来运行脚本并在每次更改任何值时在单元格中设置消息,因此这可能会很快变得烦人.如前所述,它还需要更改范围以使其触发,因此对于相当静态的文件并不真正有用.
选项2:使用OnChange事件
虽然运行时感觉比上面的选项好,并且这不依赖于电子表格单元格中的值更改,但我不喜欢这样,因为它会强制名称的位置.如果您愿意,可以使用"实用工具"工作表在各种工作表中定义此位置.以下是基本想法,如果您喜欢此选项,可以帮助您入门.
更改工作表名称时会触发OnChange事件.您可以使下面的代码更复杂,以检查错误,检查工作表ID仅适用于给定的工作表等.但基本代码是:
function setSheetName(e) {
var key = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('K1').setValue(key);
}
Run Code Online (Sandbox Code Playgroud)
保存代码后,在脚本编辑器中将当前项目的On Change Trigger设置为此功能.它将在任何更改事件上将工作表名称写入单元格K1.要设置触发器,请在" 编辑"菜单下选择" 当前项目的触发器 " .
Nic*_*nel 12
这是我对脚本的建议,该脚本从参数中的工作表列表中的位置返回工作表的名称。如果未提供参数,则返回当前工作表名称。
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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以像任何函数一样在单元格中使用它
=sheetName() // display current sheet name
=sheetName(1) // display first sheet name
=sheetName(5) // display 5th sheet name
Run Code Online (Sandbox Code Playgroud)
如其他答案所述,您需要将此代码添加到脚本中:
Tools > Script editor
Run Code Online (Sandbox Code Playgroud)
如果您从其他工作表中引用工作表,则可以使用CELL函数获取工作表名称。然后,您可以使用正则表达式提取工作表名称。
=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
Run Code Online (Sandbox Code Playgroud)
更新:公式将随着将来的更改自动更新“表名”,但是最初输入公式时,您需要引用该工作表上的单元格(例如A1)。
我终于在不使用脚本的情况下以半自动方式工作了......但它确实需要 3 个单元才能完成。借用之前的答案,我从一个单元格开始,该单元格中除了 =NOW() 之外什么也没有,用于显示时间。例如,我们将其放入单元格 A1...
=NOW()
Run Code Online (Sandbox Code Playgroud)
该功能每分钟自动更新。在下一个单元格中,使用工作表自己的名称放置一个指针公式以指向上一个单元格。例如,我们将其放在 A2 中...
='Sheet Name'!A1
Run Code Online (Sandbox Code Playgroud)
除了单元格格式之外,单元格 A1 和 A2 此时应该显示相同的内容......即当前时间。
而且,最后一个单元格是我从以前的解决方案中借用的部分,使用正则表达式从第二个单元格中提取公式,然后从所述公式中删除工作表的名称。例如,我们将其放入单元格 A3...
=REGEXREPLACE(FORMULATEXT(A2),"='?([^']+)'?!.*","$1")
Run Code Online (Sandbox Code Playgroud)
此时,A3中显示的结果值应该是工作表的名称。
根据我的经验,只要工作表名称更改,A2 中的公式就会立即更新。但这还不足以触发 A3 更新。但是,当单元格 A1 重新计算时间时,每分钟单元格 A2 中的公式结果都会随之更新,然后依次触发 A3 使用新的工作表名称进行更新。这不是一个紧凑的解决方案......但它似乎确实有效。
小智 7
一个旧线程,但很有用……所以这里有一些额外的代码。
首先,为了回应 Craig 关于正则表达式过于贪婪并且对于包含单引号的工作表名称失败的观点,这应该可以解决问题(用您自己的工作表和单元格引用替换 'SHEETNAME'!A1 ):
=IF(TODAY()=TODAY(), SUBSTITUTE(REGEXREPLACE(CELL("address",'SHEETNAME'!A1),"'?(.+?)'?!\$.*","$1"),"''","'", ""), "")
Run Code Online (Sandbox Code Playgroud)
它使用惰性匹配(“.+?”)来查找一个字符串(包括引号),该字符串可能被或可能不被引号包围,但肯定以 bang 美元(“!$”)结尾,后跟任意数量的字符. Google 表格实际上通过附加另一个引号(如 '')来保护工作表名称中的引号,因此需要 SUBSTITUTE 将这些引号减少回单引号。
该公式还允许包含刘海 ("!") 的工作表名称,但对于使用 bang 美元 ("!$") 的名称将失败 - 如果您确实需要使工作表名称看起来像完整的绝对单元格引用,则输入bang 和美元之间的分隔字符(例如空格)。
请注意,它只有在指向与公式所在的工作表不同的工作表时才能正常工作!这是因为 CELL("address" 在同一工作表上使用时仅返回单元格引用(而不是工作表名称)。如果您需要工作表显示其自己的名称,请将公式放在另一张工作表的单元格中,将其指向你的目标表,然后从目标表中引用公式单元格。我的工作簿中经常有一个“元”表来保存设置、通用值、数据库匹配条件等,这也是我放置这个公式的地方。
正如其他人在上面多次说过的那样,如果您将工作簿的重新计算设置为“更改时和每分钟”,您可以在文件|设置|计算菜单中找到,Google 表格只会注意到工作表名称的更改。可能需要长达一分钟的时间才能获取更改。
其次,如果像我一样,您碰巧需要一个适用于 Google Sheets 和 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))
Run Code Online (Sandbox Code Playgroud)
这使用 INFO("release") 来确定我们在哪个平台上...... Excel 返回一个 > 0 的数字,而 Google Sheets 没有实现 INFO 函数并生成一个错误,公式将其捕获为 0 并用于数值比较。谷歌代码分支如上。
为清晰和完整起见,这是仅限 Excel 的版本(它确实正确返回了它所在的工作表的名称):
=MID(CELL("filename",'SHEETNAME'!A1),FIND("]",CELL("filename",'SHEETNAME'!A1))+1,255)
Run Code Online (Sandbox Code Playgroud)
它在 CELL("filename" 的输出中查找 "]" 文件名终止符,并使用 MID 函数从字符串的剩余部分中提取工作表名称。Excel 不允许工作表名称包含 "]" 所以这是有效的对于所有可能的工作表名称。在可互操作的版本中,Excel 很高兴能够调用不存在的 REGEXREPLACE 函数,因为它永远不会执行 Google 代码分支。
我想我找到了一个愚蠢的解决方法=cell()
和帮助表。从而避免自定义函数和应用程序脚本。
=cell("address",[reference])
将为您提供指向所引用单元格地址的字符串引用(即“$A$1”)。问题是它不会提供工作表引用,除非单元格在不同的工作表中!
所以:
在哪里
这也适用于命名工作表。然后一定要调整以适应您的用例。
资料来源:https : //docs.google.com/spreadsheets/d/1_iTD6if3Br6nV5Bn5vd0E0xRCKcXhJLZOQqkuSWvDtE/edit#gid=1898848593
小智 6
我有一张供其他人使用的工作表,并且周围有很多间接()引用,因此我需要以公式化的方式处理更改后的工作表选项卡名称。
我使用了 JohnP2(如下)中的公式,但遇到了麻烦,因为当工作表名称更改时它不会自动更新。您需要转到实际公式,进行任意更改并刷新才能再次运行它。
=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
Run Code Online (Sandbox Code Playgroud)
我通过使用此解决方案中找到的有关如何强制刷新函数的信息解决了这个问题。它可能不是最优雅的解决方案,但它迫使表格关注此单元格并定期更新它,以便它捕获更新的表格标题。
=IF(TODAY()=TODAY(), REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1"), "")
Run Code Online (Sandbox Code Playgroud)
使用此功能,表格知道每次进行更改时刷新此单元格,这会导致每当用户重命名地址时都会更新该地址。
归档时间: |
|
查看次数: |
61350 次 |
最近记录: |