【问题标题】:How to extract URLs from cell values without timing out?如何从单元格值中提取 URL 而不会超时?
【发布时间】:2021-08-04 10:37:09
【问题描述】:

我有一个包含超过 100k 行的长电子表格,其中特定列的值主要是包含链接的值。这些值在不使用任何函数(如超链接)的情况下保存链接,我正在尝试找到将它们提取到不同列中的最有效方法。

我创建了一个电子表格,使用下面的脚本从 H 列中的值中提取 url(第一列):

https://docs.google.com/spreadsheets/d/1_y0PD3n35AKNEAcvCLKBGEmTpThjD3LQTScndaytpWA/edit#gid=0

我面临的问题是,在大多数情况下,我都会遇到处理错误,即函数超时。那么提取 URL 的最佳方法是什么?

function RichTextLinks(rangeA1, dynamic_reference) {
if (typeof rangeA1 !== 'string') {
throw new Error('RichTextLinks expected rangeA1 to be a text string like "A2:A42" but got ' + Object.prototype.toString.call(rangeA1) + ' instead.');
}
const range = SpreadsheetApp.getActiveSheet().getRange(rangeA1);
const richText = range.getRichTextValues();
return richText.map(row => row.map(value => value.getLinkUrl()));
}

【问题讨论】:

  • 你确定它只是超时吗?我刚刚用 100,000 个富文本链接做了一个测试,不到一分钟就完成了。您能否提供更多有关您正在做什么的背景信息,因为它可能是脚本的另一部分超时?您还可以澄清为什么您尝试使用自定义函数而不只是从编辑器运行脚本吗?
  • @iansedano 感谢您的评论!只是提醒我是脚本新手。我的电子表格确实有更多的公式和计算,我认为处理所有内容可能需要很长时间。因此,RichTextLinks 函数要么保持“正在加载”,要么给出#ERROR。我正在使用一个函数,因为数据是动态的并且不断变化,但我也不知道如何从编辑器中运行所有内容,使其每天自动化。如果您认为这样会更好,任何示例都会很棒?提前致谢!

标签: google-apps-script google-sheets


【解决方案1】:

自定义函数有 30 秒超时,从编辑器执行脚本

来自guide on custom functions

自定义函数调用必须在 30 秒内返回。

我怀疑 100k 行刚好超过这个限制!

使用触发器

例如,您可以使用triggers 来更新值。例如,时间驱动的触发器time-driven trigger。例如,您可以让它每 15 分钟运行一次。这取决于你需要它来做什么,只是注意你不要跑过quotas

function RichTextLinks() {
    const range = SpreadsheetApp.getActive().getSheetByName("Sheet1").getRange("H3:H");
    const richText = range.getRichTextValues();
    const hyperlinks = richText.map(row => row.map(value => value.getLinkUrl()));

    const outputRange = SpreadsheetApp.getActive().getSheetByName("Sheet1").getRange("I3:I");
    outputRange.setValues(hyperlinks)
}

您可以按照说明here 手动设置触发器。或运行此函数一次

function createTimeDrivenTrigger() {
  ScriptApp.newTrigger('RichTextLinks')
      .timeBased()
      .everyMinutes(15)
      .create();

您可能会被onEdit 触发器所吸引,每次您对电子表格进行编辑时都会运行该触发器。但是要注意,因为这个函数运行时间太长,所以它不会很好地工作。

以防万一,要从脚本编辑器手动运行脚本,您只需在此处选择要运行的函数:

然后按“运行”!

参考文献

【讨论】:

  • 这与时间触发器配合得非常好!非常感谢@iansenado,你是一个 leyend!
【解决方案2】:

使用getValues()对整列进行批量请求。

应该可以解决超时问题。

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 2017-06-03
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多