答案 0 :(得分:11)
这是我在Google表格中找到的内容:
要获取Google表格中的当前表格名称,以下简单脚本可以帮助您,而无需手动输入名称,请按以下步骤操作:
单击工具>脚本编辑器
在打开的项目窗口中,将以下脚本代码复制并粘贴到空白的“代码”窗口中,请参见屏幕截图:
............................
function sheetName() {
return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
}
然后保存代码窗口,并返回到要获取其名称的工作表,然后在单元格中输入以下公式:=sheetname()
,然后按Enter键,工作表名称将立即显示
请参见以下链接,并附上截图:https://www.extendoffice.com/documents/excel/5222-google-sheets-get-list-of-sheets.html
答案 1 :(得分:8)
你有两个选择,我不确定我是否喜欢他们,但这是我的意见。你可能会有不同的感受:
选项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);
}
保存代码后,在脚本编辑器中将当前项目的On Change Trigger设置为此功能。它将在任何更改事件上将工作表名称写入单元格K1。要设置触发器,请在修改菜单下选择当前项目的触发器。
答案 2 :(得分:2)
如果从另一张图纸中引用该图纸,则可以使用CELL函数获得图纸名称。然后,您可以使用正则表达式提取工作表名称。
=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
更新: 公式会随着将来的更改自动更新“表名”,但是最初输入公式时,您需要引用该工作表上的单元格(例如A1)。
答案 3 :(得分:1)
我有一个供其他人使用的工作表,并且周围有很多indirect()引用,因此我需要以公式方式处理更改后的工作表标签名称。
我使用了JohnP2(如下)中的公式,但是遇到了麻烦,因为当工作表名称更改时它不会自动更新。您需要转到实际公式,进行任意更改,然后刷新以再次运行它。
=REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
我通过使用this solution中有关如何强制刷新函数的信息来解决了这个问题。它可能不是最优雅的解决方案,但它迫使Sheets注意此单元格并定期对其进行更新,以使其捕获到更新的工作表标题。
=IF(TODAY()=TODAY(), REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1"), "")
使用此方法,Sheets知道每次进行更改时都会刷新此单元格,从而导致该地址在用户重命名时都会更新。
答案 4 :(得分:0)
这是我对脚本的建议,该脚本将从参数在工作表列表中的位置返回工作表的名称。如果未提供任何参数,则返回当前的工作表名称。
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 :(得分:0)
我终于可以在不使用脚本的情况下以半自动方式对其进行工作了……但是确实需要3个单元格才能完成。从先前的答案中借用一点点,我从一个只包含= NOW()来显示时间的单元格开始。例如,我们将其放入单元格A1 ...
=NOW()
此功能每分钟自动更新。在下一个单元格中,使用工作表自身名称放置一个指针公式以指向上一个单元格。例如,我们将其放入A2 ...
='Sheet Name'!A1
除单元格格式设置外,此时单元格A1和A2应该显示相同的内容……即当前时间。
最后一个单元格是我从以前的解决方案中借用的部分,它使用正则表达式从第二个单元格中提取公式,然后从所述公式中删除工作表的名称。例如,我们将其放入单元格A3 ...
=REGEXREPLACE(FORMULATEXT(A2),"='?([^']+)'?!.*","$1")
这时,A3中显示的结果值应该是工作表的名称。
根据我的经验,工作表名称一旦更改,A2中的公式就会立即更新。但是,这还不足以触发A3更新。但是,每隔一分钟,当单元格A1重新计算时间时,单元格A2中的公式结果随后就会更新,然后触发A3以新的工作表名称进行更新。这不是一个紧凑的解决方案...但是它确实可以工作。
答案 6 :(得分:0)
一个旧线程,但是一个有用的线程...所以这里是一些附加代码。
首先,为了回应Craig关于正则表达式过于贪婪并且对于包含单引号的工作表名称失败的观点,这应该可以解决问题(用您自己的工作表和单元格引用替换'SHEETNAME'!A1):
=IF(TODAY()=TODAY(), SUBSTITUTE(REGEXREPLACE(CELL("address",'SHEETNAME'!A1),"'?(.+?)'?!\$.*","$1"),"''","'", ""), "")
它使用一个惰性匹配(“。+?”)来查找一个字符串(包括引号),该字符串可能包含也可能不包含在引号中,但肯定以大写美元(“!$”)结尾,后跟任意字符数。 Google表格实际上通过附加另一个squote来保护工作表名称中的squotes(如''中所示),因此需要用SUBSTITUTE才能将其减少为单个squotes。
该公式还允许包含刘海(“!”)的工作表名称,但对于使用bang美元(“!$”)的工作表名称将失败-如果您确实需要使工作表名称看起来像完整的绝对单元格引用然后在大括号和美元之间放置一个分隔符(例如空格)。
请注意,当指向与公式所在的图纸不同的图纸时,它将仅可以正常工作!这是因为CELL(“ address”在同一张工作表上使用时仅返回单元格引用(而不是工作表名称)。如果需要工作表以显示其自己的名称,则将公式放在另一张工作表的单元格中,将其指向您的目标工作表,然后从目标工作表中引用公式单元格。我的工作簿中经常有一个“ Meta”工作表,用于保存设置,公用值,数据库匹配条件等,因此我也将公式放在此位置。
正如上面其他人多次说过的,如果您将工作簿的重新计算设置为“在更改时每分钟”,您可以在“文件” |“设置” |“计算”菜单中找到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表格不会实现INFO函数,并会生成错误,公式会将该错误捕获为0,并用于数值比较。 Google代码分支如上所述。
为清楚和完整起见,这是仅限Excel的版本(确实会正确返回其所在工作表的名称):
=MID(CELL("filename",'SHEETNAME'!A1),FIND("]",CELL("filename",'SHEETNAME'!A1))+1,255)
它将在CELL(“ filename”)的输出中查找“]”文件名终止符,并使用MID函数从字符串的其余部分提取工作表名称。Excel不允许工作表名称包含“]”因此,这适用于所有可能的工作表名称。在可互操作的版本中,Excel很高兴收到对不存在的REGEXREPLACE函数的调用,因为它永远无法执行Google代码分支。
答案 7 :(得分:0)
我认为我发现使用=cell()
和帮助表的一种愚蠢的解决方法。这样就避免了自定义功能和应用脚本。
=cell("address",[reference])
将为您提供所引用单元格地址的字符串引用(即“ $ A $ 1”)。问题在于,除非单元格位于其他工作表中,否则它将不提供工作表引用 !
所以:
其中
这也适用于命名工作表。然后一定要调整以适合您的用例。
答案 8 :(得分:0)
如果要使用内置功能:
=REGEXEXTRACT(cell("address";'Sheet1'!A1);"^'(.*)'!\$A\$1$")
说明:
cell("address";'Sheet1'!A1)
为您提供工作表的地址,输出为'Sheet1'!$A$1
。现在我们需要从该输出中提取实际的工作表名称。我正在使用REGEXEXTRACT通过正则表达式^'(.*)'!\$A\$1$
进行匹配,但是您可以使用更多/更少的特定正则表达式,也可以使用类似SUBSTITUTE或REPLACE