首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序脚本自定义函数在脚本编辑器中工作,但在Google工作表自定义函数中不工作。

应用程序脚本自定义函数在脚本编辑器中工作,但在Google工作表自定义函数中不工作。
EN

Stack Overflow用户
提问于 2021-11-26 01:35:08
回答 2查看 309关注 0票数 0

我在Apps脚本中构建了一个简单的自定义函数,使用URLFetchApp获取TikTok帐户的追随者计数。

代码语言:javascript
复制
function tiktok_fans() {
  var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
  var handle = '@charlidamelio';
  var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
  var match_text = raw_data.exec(web_content);
  var result = (match_text[2]);
  Logger.log(result)
  return result
}

日志返回的是正确的追随者号码。

但是,当我将代码更改为;

代码语言:javascript
复制
function tiktok_fans(handle) {
  var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
  //var handle = '@charlidamelio';
  var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
  var match_text = raw_data.exec(web_content);
  var result = (match_text[2]);
  Logger.log(result)
  return result
}

并在电子表格中使用,例如=tiktok_fans(A1),其中A1有@charlidamelio,我在单元格中得到#ERROR响应

TypeError:无法读取null的属性'2‘(第6行)。

为什么它在日志中工作,而在电子表格中却不起作用?

--附加信息--

在测试@Tanaike之后仍然得到相同的错误:"TypeError:无法读取null的属性'2‘(第6行)。“

已手动映射以查看错误,每次运行以下日志时,都会返回"null“。我相信这与缓存中的ContentText大小有关。我尝试过在函数之间使用Utilities.sleep(),但没有运气,我仍然得到null。

代码

代码语言:javascript
复制
  var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);

  //tiktok urls
  var qld = UrlFetchApp.fetch('https://www.tiktok.com/@thisisqueensland?lang=en').getContentText();
  var nsw = UrlFetchApp.fetch('https://www.tiktok.com/@visitnsw?lang=en').getContentText();
  var syd = UrlFetchApp.fetch('https://www.tiktok.com/@sydney?lang=en').getContentText();
  var tas = UrlFetchApp.fetch('https://www.tiktok.com/@tasmania?lang=en').getContentText();
  var nt = UrlFetchApp.fetch('https://www.tiktok.com/@ntaustralia?lang=en').getContentText();
  var nz = UrlFetchApp.fetch('https://www.tiktok.com/@purenz?lang=en').getContentText();
  var aus = UrlFetchApp.fetch('https://www.tiktok.com/@australia?lang=en').getContentText();
  var vic = UrlFetchApp.fetch('https://www.tiktok.com/@visitmelbourne?lang=en').getContentText();

  //find folowers with regex
  var match_qld = raw_data.exec(qld);
  var match_nsw = raw_data.exec(nsw);
  var match_syd = raw_data.exec(syd);
  var match_tas = raw_data.exec(tas);
  var match_nt = raw_data.exec(nt);
  var match_nz = raw_data.exec(nz);
  var match_aus = raw_data.exec(aus);
  var match_vic = raw_data.exec(vic);

  Logger.log(match_qld);
  Logger.log(match_nsw);
  Logger.log(match_syd);
  Logger.log(match_tas);
  Logger.log(match_nt);
  Logger.log(match_nz);
  Logger.log(match_aus);
  Logger.log(match_vic);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-26 04:40:37

问题:

从您的情况来看,我记得使用自定义函数的UrlFetchApp请求与脚本编辑器中的UrlFetchApp请求不同。所以我认为你的问题的原因可能与这条线有关。https://stackoverflow.com/a/63024816在您的情况下,您的情况似乎与此线程相反。但是,据认为,这一问题是由于该网站的规格。

为了检查这个差异,我检查了检索到的HTML数据的文件大小。

  • 脚本编辑器执行的UrlFetchApp检索的文件大小为518k字节,
  • 使用自定义函数执行的UrlFetchApp检索的文件大小为9k字节。
    • 使用自定义函数执行UrlFetchApp的请求似乎与执行withWeb应用程序的UrlFetchApp的请求相同。利用this.

检索9k字节的数据

从以上结果可以看出,脚本编辑器和自定义函数之间检索到的HTML是不同的。也就是说,自定义函数检索的HTML数据不包括("followerCount":)([0-9]+)的正则表达式。这样,就会发生这样的错误。我想这可能是你出问题的原因。

解决办法:

当我用Web应用程序和触发器测试您的情况时,也会出现同样的问题。因此,在当前阶段,我认为自动执行脚本的方法可能无法使用。因此,作为解决办法,使用按钮和自定义菜单如何?当脚本由按钮和自定义菜单运行时,脚本工作。该方法似乎与脚本编辑器的方法相同。

示例脚本如下所示。

示例脚本:

在运行脚本之前,请设置range。例如,请将此功能分配给电子表格上的一个按钮。单击该按钮时,脚本将运行。在这个示例中,它假设像@charlidamelio这样的值被放到列"A“中。

代码语言:javascript
复制
function sample() {
  var range = "A2:A10"; // Please set the range of "handle".
  var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
  var sheet = SpreadsheetApp.getActiveSheet();
  var r = sheet.getRange(range);
  var values = r.getValues();
  var res = values.map(([handle]) => {
    if (handle != "") {
      var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
      var match_text = raw_data.exec(web_content);
      return [match_text[2]];
    }
    return [""];
  });
  r.offset(0, 1).setValues(res);
}

运行此脚本时,将从检索值,并将其放入列"B".。

注意:

  • 这是一个简单的脚本。因此,请根据实际情况修改它。

参考资料:

添加:

关于以下附加问题,

虽然对一个TikTok句柄有效,但当尝试运行一个多个列表时,每次都会失败,而错误TypeError:无法读取属性'2‘的null。在进行了一些调查并手动映射了8个句柄之后,我可以看到,每次它运行时,它都会返回一个或多个web_content变量的"null“。是否有办法使脚本慢下来/一次运行每个UrlFetchApp,以确保每个UrlFetchApp都返回内容?我已经试过了,但还是有一个错误。已经试过10000毫秒了。我在最初的问题中增加了一些更多的细节,希望这对错误是有意义的。总是在不同的日志中获得空值,因此我认为这是一个时间或缓存问题。

在本例中,下面的示例脚本如何?

示例脚本:

在此示例脚本中,当无法从URL检索值时,将再次尝试在重试时检索该值。此示例脚本使用这2次作为重试。因此,当2次重试无法检索该值时,将返回空值。

代码语言:javascript
复制
function sample() {
  var range = "A2:A10"; // Please set the range of "handle".
  var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
  var sheet = SpreadsheetApp.getActiveSheet();
  var r = sheet.getRange(range);
  var values = r.getValues();
  var res = values.map(([handle]) => {
    if (handle != "") {
      var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
      var match_text = raw_data.exec(web_content);
      if (!match_text || match_text.length != 3) {
        var retry = 2; // Number of retry.
        for (var i = 0; i < retry; i++) {
          Utilities.sleep(3000);
          web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
          match_text = raw_data.exec(web_content);
          if (match_text || match_text.length == 3) break;
        }
      }
      return [match_text && match_text.length == 3 ? match_text[2] : ""];
    }
    return [""];
  });
  r.offset(0, 1).setValues(res);
}

请调整Utilities.sleep(3000).和

  • retry值。
票数 5
EN

Stack Overflow用户

发布于 2021-11-26 04:02:28

对于我来说,这是一个自定义函数:

代码语言:javascript
复制
function MYFUNK(n=2) {
  const url = 'my website url'
  const re = new RegExp(`<p id="un${n}.*\/p>`,'g')
  const r = UrlFetchApp.fetch(url).getContentText();
  const v = r.match(re);
  Logger.log(v);
  return v;
}

我使用了自己的网站,我有几段带有I的段落,从un1到un7,我把A1的值作为唯一的参数。每次更改它时,它都会返回正确的字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70118777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档