【问题标题】:How can I automatically turn a column value in Google Sheets into a hyperlink based on the value?如何根据值自动将 Google 表格中的列值转换为超链接?
【发布时间】:2021-10-08 03:55:09
【问题描述】:

我有一张表格,其中一列包含 Jira 票证的 ID。

我想根据我输入的值自动将其转换为票证链接。

例如我将在列中输入 SD-1234,然后我希望它成为指向 https://demo.atlassian.net/browse/SD-1234/ 的可点击链接,但不显示单元格中的 URL,而是我输入的原始值 (SD-1234)。

如果有帮助,该列始终为 E。有人可以先告诉我如何在脚本编辑器中编写脚本吗?

【问题讨论】:

    标签: google-apps-script google-sheets jira


    【解决方案1】:

    例如,当单元格“E1”有SD-1234时,使用=HYPERLINK("https://demo.atlassian.net/browse/"&E1, E1),其值为SD-1234,超链接为https://demo.atlassian.net/browse/SD-1234。但在这种情况下,结果不能直接显示在单元格“E1”中。当你想通过https://demo.atlassian.net/browse/SD-1234的超链接直接将单元格“E1”中的SD-1234转换为SD-1234,下面的示例脚本怎么样?

    示例脚本:

    请复制并粘贴以下脚本并在脚本编辑器中运行该函数。在使用之前,请设置工作表名称。

    此示例脚本从“E”列中的SD-1234 转换为=HYPERLINK("https://demo.atlassian.net/browse/SD-1234", "SD-1234")

    function sample1() {
      const sheetName = "Sheet1"; // Please set the sheet name.
      const baseUrl = "https://demo.atlassian.net/browse/";
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
      const range = sheet.getRange("E1:E" + sheet.getLastRow());
      const values = range.getValues().map(([e]) => [`=HYPERLINK("${baseUrl}${e}", "${e}")`]);
      range.setFormulas(values);
    }
    

    此示例脚本将“E”列中的SD-1234 转换为SD-1234,超链接为https://demo.atlassian.net/browse/SD-1234。在这种情况下,不使用公式。

    function sample2() {
      const sheetName = "Sheet1"; // Please set the sheet name.
      const baseUrl = "https://demo.atlassian.net/browse/";
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
      const range = sheet.getRange("E1:E" + sheet.getLastRow());
      const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl + e).build()]);
      range.setRichTextValues(values);
    }
    

    注意:

    • 如果您的电子表格有第一个标题行,请将"E1:E" + sheet.getLastRow() 修改为"E2:E" + sheet.getLastRow()

    参考资料:

    新增1:

    来自您的以下 cmets,

    我必须设置工作表名称吗?我有几张我一直希望应用此功能的工作表(我目前在文件中有 20 多张工作表)。

    另外,我已经将它输入到脚本编辑器中进行测试,从这里我该怎么做?我看不到任何保存...而且它没有在我的工作表上运行。每当在单元格中输入值时,如何将其应用于我的工作表以自动运行?

    当上述情况反映在脚本中时,变成如下。

    示例脚本:

    请将以下脚本复制并粘贴到脚本编辑器并保存。请编辑工作表的“E”列。这样,单元格就有了与输入文本的超链接。

    function onEdit(e) {
      const sheetNames = ["Sheet1", "Sheet2",,,]; // Please set the sheet names you want to run the script.
      const column = 5; // Column E. From your question, this script run for the column "E".
    
      const {range} = e;
      const sheet = range.getSheet();
      const baseUrl = "https://demo.atlassian.net/browse/";
      if (!sheetNames.includes(sheet.getSheetName()) || range.columnStart != column) return;
      const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl + e).build()]);
      range.setRichTextValues(values);
    }
    

    如果要对所有工作表运行脚本,可以使用以下脚本。

    function onEdit(e) {
      const column = 5; // Column E. From your question, this script run for the column "E".
    
      const {range} = e;
      const sheet = range.getSheet();
      const baseUrl = "https://demo.atlassian.net/browse/";
      if (range.columnStart != column) return;
      const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl + e).build()]);
      range.setRichTextValues(values);
    }
    

    新增2:

    如果您想通过一个脚本运行将脚本运行到所有工作表的“E”列,也可以使用以下脚本。

    示例脚本:

    此示例脚本针对特定工作表运行。

    function myFunction() {
      const sheetNames = ["Sheet1", "Sheet2",,,]; // Please set sheet names you want to run the script.
    
      const baseUrl = "https://demo.atlassian.net/browse/";
      SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(sheet => {
        if (!sheetNames.includes(sheet.getSheetName())) return;
        const range = sheet.getRange("E1:E" + sheet.getLastRow());
        const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl + e).build()]);
        range.setRichTextValues(values);
      });
    }
    

    此示例脚本适用于所有工作表。

    function myFunction() {
      const baseUrl = "https://demo.atlassian.net/browse/";
      SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(sheet => {
        const range = sheet.getRange("E1:E" + sheet.getLastRow());
        const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl + e).build()]);
        range.setRichTextValues(values);
      });
    }
    

    【讨论】:

    • 我必须设置工作表名称吗?我有几张我一直希望应用此功能的工作表(我目前在文件中有 20 多张工作表)。
    • @Lee 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,根据您的问题,我无法理解您的 cmets 中的这种情况。我对此深表歉意。当您的 cmets 中的情况反映在脚本中时,示例脚本如上所示。请证实。如果我误解了你的问题,我再次道歉。
    • @Lee 我担心我是否能正确理解您的问题。因此,我在答案中又添加了一个示例脚本。你能确认一下吗?如果这些没有用,我再次道歉。
    • 请不要因为不理解某些内容而在回答帖子时混乱 - Stack Overflow 不是聊天室。在 cmets 中寻求澄清,然后编辑帖子。如果您完全不理解问题,请在您理解之前不要回答。
    • 请记住,答案不是您和发帖人之间的对话。它们是对许多读者有用的通用问答的一部分。回答时请牢记一般受众,如果您还设法帮助问题作者,那就更好了。
    猜你喜欢
    • 2023-01-12
    • 2013-08-31
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2019-12-24
    • 2021-10-31
    相关资源
    最近更新 更多