【问题标题】:How to get url from Google Spreadsheet cell with Google Apps Script?如何使用 Google Apps 脚本从 Google 电子表格单元格获取 url?
【发布时间】:2017-02-13 18:37:27
【问题描述】:

我有一个从 excel 复制的谷歌电子表格,我对此有一些问题。 这是我的文件https://docs.google.com/spreadsheets/d/1Ok_phu5OXtvKHLj3MLa7N3WV2qBdMWRz8dLHnTqjHrc/edit?usp=sharing

这是我的代码

function myFunction() {
  cel = SpreadsheetApp.getActiveSpreadsheet().getActiveCell()
  Logger.log(cel.getFormula())
  Logger.log(cel.getValue())
}

这是我的日志:

[16-10-05 13:39:59:628 EEST] 
[16-10-05 13:39:59:629 EEST] RU: VTB Arena - Park and Hotel

我需要获取一个 URL (https://na3.salesforce.com/0065000000a1b8p) 我该怎么做?

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:

试试这个:

var url = /"(.*?)"/.exec(cel.getFormulaR1C1())[1];
Logger.log(url);

当我手动将其添加为链接时,它提取了 URL。

请注意,我在测试中使用了以下内容:

  var dataSheet = CentralSS.getSheetByName(CENTRAL_DATAFILES_SHEETNAME);
  var range = dataSheet.getRange("E2");
  var url = /"(.*?)"/.exec(range.getFormulaR1C1())[1];

【讨论】:

  • 当我在设置变量后立即运行调试并中断时,URL 包含链接。我错过了什么吗?
  • 您的代码适用于具有超链接函数的公式的单元格,但不适用于 OP 提出的情况。
  • 我没有意识到右键单击以将链接与创建公式的文本相关联。我现在明白了。您是对的,我能够从网站复制链接并将其粘贴,但无法获取 URL。我无法使用他的电子表格中的链接复制它。我很抱歉错过了粘贴链接将单元格更改为公式。
【解决方案2】:

此时 Google Apps Script 的电子表格服务无法获取单元格富文本内容的属性,只能通过 getValue() 方法获取纯文本。 getFormula()、getNote()等其他方法都可以获取对应的单元格属性,但都没有包含链接的URL。

在 Google 表格上,解决方法是手动获取 URL。一种以编程方式替代的方法是,在将文件转换为 Google 表格格式之前,在 Excel 文件上使用 VBA 来获取超链接。详情请参阅answerCan I use an excel formula to extract the link location of a hyperlink in a cell?

【讨论】:

    【解决方案3】:

    我认为最好将 google 电子表格发布到网络上,然后使用 BS4 解析 html 以获取 url。

    【讨论】:

      【解决方案4】:

      感谢您提出这个问题!我自己一直在找这个!我将 Facebook 好友列表复制到电子表格中。他们复制为富文本,这意味着它们包含一个链接,但它不以 =Hypertext 格式提供。

      我一直在寻找,似乎肯定没有简单的方法解决这个问题。

      然后我偶然发现了它。

      只需选择包含富文本的单元格(假设您希望在将鼠标悬停在其上时获取其中包含的链接)并按 Command-K 以编辑链接。

      它会弹出一个窗口,您可以在其中在顶部字段中输入单元格文本,在底部字段中输入 URL。

      无需输入任何内容 - 默认情况下就在那里。所以只需点击 [Enter] 和 BAM!它现在的格式为 =HYPERLINK("URL","Text")

      但我有数百个需要转换,并且想找到一种更简单的方法。

      所以我偶然发现了 AppleScript(直到今天我才使用它——即使我完全从 Apple 过渡)。

      我创建了一个简单的 AppleScript:

      告诉应用程序“Google Chrome”激活 延迟 0.5 告诉应用程序“系统事件” 延迟 0.5 告诉进程“Chrome” 使用向下命令击键“k” 延迟 0.2 击键返回 延迟 0.2 击键返回 延迟 0.2 击键返回 延迟 0.2 结束告诉 结束告诉

      在电子表格中选择您要编辑的单元格(假设您使用的是 Google Chrome),然后运行此 AppleScript。

      我制作了几个脚本,全部以美元为单位。所以我有一个只运行一次,然后是 5x、10x、20x、50x 和 100x。

      所以对于我的 143 个名称列表,我刚刚运行了 100x 脚本,然后运行了 50x 脚本。当我看着我的电脑快速为我完成工作时,我伤心地喝了口咖啡。

      很抱歉,如果这比人们正在寻找的信息更多 - 这是我第一次在这里回答问题(我记得),而且,如果我偶然发现了我现在正在写的答案 - 它会今年早些时候真是天赐之物!

      编码愉快!

      【讨论】:

        【解决方案5】:

        这是我用来从单元格获取链接的解决方法。显然,当您使用 ctrl+K 添加链接时,它们将作为富文本而不是公式添加。我在 google sheet 中使用下面的函数将这些带有链接的富文本字段转换为 html。如果字段中有链接,则返回链接的 html 代码。如果没有链接,那么它只会返回传入的文本。当然这可以做得更优雅......我使用了很多变量来更容易地了解正在发生的事情。

        //get link from a cell given by A1 notation
        function getHtmlfromRichTextRange(theRange){
          var sheet = SpreadsheetApp.getActiveSpreadsheet();
          var range = sheet.getRange(theRange);
          var cell = range; 
          var cellValue = cell.getRichTextValue();
          var cellText = cell.getValue();
          var theThing = cellValue.getLinkUrl();
        
          if (theThing == null){
            return cellText;
          } else {
            return '<a href="'+theThing+'">'+cellText+'</a>'; 
          }
        }
        

        在电子表格中,您可以执行类似的操作(参见图片 1):

        1. 在单元格 A1 中,输入“指向苹果的链接”
        2. 在单元格 A1 突出显示的情况下,按 ctrl+k 将超链接添加到 http://www.apple.com
        3. 在单元格 B1 中,输入 A1
        4. 在单元格C1中,输入公式=getHtmlfromRichTextRange(B1)

        结果,您应该会看到值

        &lt;a href="http://www.apple.com/"&gt;a link to apple&lt;/a&gt; 在单元格 C1 中

        以这种方式处理此示例时,我注意到以下几点:

        • 如果 C1 中的函数只返回 url 而不是带有一些字符串文本的 url,那么 Google 表格也会将 C1 转换为 RichText。由于我使用它来创建 html 电子邮件,因此我让函数返回链接的 HTML 代码。
        • 我可以简化并将字符串"A1" 用引号括起来传递给函数。当 A1 中的富文本链接更新时,我试图找到一种方法来更新 C1 中的公式。我的想法是,如果 A1 发生了变化(例如 URL 发生了变化),那么 C1 中函数的结果会自动更新。它没有。我没有追究。上面写的对我有用。
        • 如果链接是单元格中的所有文本,则此代码有效。如果单元格中有一些包含超链接的文本和一些没有超链接的文本(例如,超链接只是单元格中文本的一部分),则此代码将其作为纯文本返回,而不是作为 URL。

        我在 AppScript 中按原样使用函数来循环包含链接的范围。在循环内部,我将单元格的 A1 表示法传递给函数,其中一些单元格具有链接。它工作得很好,为我节省了大量时间!

        我确信有更简单的方法。我通常会发现做完之后会更难,因此不需要再做。

        【讨论】:

        • 为我工作!谢谢。没有特殊的重定向会很好,但正如你所说,它有效,而且解决那个时髦的部分并不难..
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 2022-11-24
        相关资源
        最近更新 更多