Google sheets 是否有Google Sheets公式将工作表的名称放入单元格?

Google sheets 是否有Google Sheets公式将工作表的名称放入单元格?,google-sheets,Google Sheets,下面的插图应该会有所帮助: 你有两种选择,我不确定我是否喜欢其中任何一种,但这是我的观点。你可能会有不同的感觉: 选项1:强制运行该功能。 单元格中的函数除非引用已更改的单元格,否则不会运行。更改图纸名称不会触发电子表格中的任何函数。但是我们可以通过向函数传递一个范围来强制函数运行,只要该范围内的某个项发生更改,函数就会触发 您可以使用以下脚本创建一个将检索名称的自定义函数: function mySheetName() { var key = SpreadsheetApp.getActiv

下面的插图应该会有所帮助:


你有两种选择,我不确定我是否喜欢其中任何一种,但这是我的观点。你可能会有不同的感觉:

选项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触发器设置为该函数。在任何更改事件中,它都会将图纸名称写入单元格K1。要设置触发器,请选择编辑菜单下的当前项目的触发器。

以下是我为Google Sheets找到的:

要在Google sheets中获取当前工作表名称,以下简单脚本可以帮助您无需手动输入名称,请执行以下操作:

  • 单击工具>脚本编辑器

  • > p>在打开的项目窗口中,复制并粘贴下面的脚本代码到空白代码窗口中,见屏幕截图:

    function sheetName() {
      return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
    }
    
    然后保存“代码”窗口,返回要获取其名称的工作表,然后在单元格中输入以下公式:
    =sheetName()
    ,然后按enter键,将立即显示工作表名称


    通过添加的屏幕截图查看此链接:

    如果从其他工作表引用工作表,则可以使用单元格函数获取工作表名称。然后可以使用正则表达式提取工作表名称

    =REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
    
    更新:
    公式将随着将来的更改自动更新“工作表名称”,但在最初输入公式时,您需要引用该工作表上的单元格(如A1)。

    以下是我的脚本建议,该脚本将从参数中工作表列表中的位置返回工作表名称。如果未提供参数,则返回当前图纸名称

    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();
      }
    }
    
    如其他答案所述,您需要在脚本中添加以下代码:

    Tools > Script editor
    

    我有一个供其他人使用的工作表,周围有很多间接()引用,所以我需要公式化地处理更改的工作表选项卡名称

    我使用了JohnP2(如下)中的公式,但遇到了问题,因为当工作表名称更改时,它不会自动更新。您需要转到实际公式,进行任意更改并刷新以再次运行它

    =REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1")
    
    我通过使用中关于如何强制函数刷新的信息解决了这个问题。它可能不是最优雅的解决方案,但它迫使工作表关注此单元格并定期更新,以便捕获更新的工作表标题

    =IF(TODAY()=TODAY(), REGEXREPLACE(CELL("address",'SHEET NAME'!A1),"'?([^']+)'?!.*","$1"), "")
    

    使用此功能,Sheets知道每次进行更改时都会刷新此单元格,这会导致地址在用户重命名时更新。

    我最终以半自动方式使用此功能,而无需使用脚本。。。但它确实需要3个细胞才能完成。借用前面的一些答案,我从一个单元格开始,这个单元格中只有=NOW()来显示时间。例如,我们将把它放入单元格A1

    =NOW()
    
    此功能每分钟自动更新一次。在下一个单元格中,使用图纸自己的名称放置指针公式,以指向上一个单元格。例如,我们将把它放在A2中

    ='Sheet Name'!A1
    
    撇开单元格格式不谈,单元格A1和A2此时应显示相同的内容。。。即当前时间

    最后一个单元格是我从以前的解决方案中借用的部分,使用正则表达式从第二个单元格中提取公式,然后从所述公式中去掉表格的名称。例如,我们将把它放在A3单元中

    =REGEXREPLACE(FORMULATEXT(A2),"='?([^']+)'?!.*","$1")
    
    此时,A3中显示的结果值应为图纸的名称


    根据我的经验,一旦工作表的名称更改,A2中的公式就会立即更新。然而,这还不足以触发A3更新。但是,每分钟当单元格A1重新计算时间时,单元格A2中公式的结果都会随之更新,然后又会触发A3以新的图纸名称进行更新。这不是一个紧凑的解决方案。。。但它似乎确实有效。

    一条旧线索,但很有用。。。这里有一些额外的代码

    首先,为了回应Craig关于正则表达式过于贪婪且无法使用包含单引号的工作表名称的观点,这应该可以做到(用您自己的工作表和单元格引用替换“SHEETNAME”!A1):

    它使用惰性匹配(“+?”)来查找字符串(包括squotes),该字符串可能由squotes括起,也可能不由squotes括起,但肯定以bang dollar(!$)结尾,后跟任意数量的字符。谷歌
    =REGEXREPLACE(FORMULATEXT(A2),"='?([^']+)'?!.*","$1")
    
    =IF(TODAY()=TODAY(), SUBSTITUTE(REGEXREPLACE(CELL("address",'SHEETNAME'!A1),"'?(.+?)'?!\$.*","$1"),"''","'", ""), "")
    
    =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))
    
    =MID(CELL("filename",'SHEETNAME'!A1),FIND("]",CELL("filename",'SHEETNAME'!A1))+1,255)
    
    =REGEXEXTRACT(cell("address";'Sheet1'!A1);"^'(.*)'!\$A\$1$")