【问题标题】:Adding parameters to function in script editor for google sheets在 google 表格的脚本编辑器中为函数添加参数
【发布时间】:2020-06-06 08:54:22
【问题描述】:

我正在尝试自学一些编码和网站抓取。但是我在添加参数时遇到问题。没有参数,我需要调整不可取的功能。这是不带参数的工作函数

function import1() {
  var  html, content = '';
  var response = UrlFetchApp.fetch("https://www.fundsquare.net/security/summary?idInstr=275136");


  if (response) {
    html = response.getContentText();
    if (html) content = html.match(/<span class="surligneorange">([\d.]*).*<\/span>/)[1];
  }                                
   return content;
}

这就是我调整它的方式,使其具有参数:


function importval(url, name) {
  var found, html, content = '';
  var response = UrlFetchApp.fetch(url);
  found = "/<span class="+name+">([\d.]*).*<\/span>/"

  if (response) {
    html = response.getContentText();
    if (html) content = html.match(found)[1];
  }                                
   return content;
}

但是,它不起作用。当我尝试调整它时,它会给出不同的错误。问题在于URL 有一些错误,name 有其他问题。使用上面的代码,错误是url 变量没有值。我不确定如何使用参数制作公式

我知道代码found = "/&lt;span class="+name+"&gt;([\d.]*).*&lt;\/span&gt;/" 不适用于每个网站,但如果我能做到这一点,我可以弄清楚如何调整它,使其适用于我想要的网站。现在它只适用于 span 类,但可以更改它以便适用于更多网站(我认为)。

Edit 6-6 16:05这是一个关于解决方案的问题

这是匹配应该找到的代码: (/&lt;span class="surligneorange"&gt;([\d.]*).*&lt;\/span&gt;/)[1];

这是你写的代码 ("&lt;span class=\""+name+"\"&gt;([\\d.]*).*&lt;\\/span&gt;")

需要\""+name+"\" 中的两个\ 的原因是什么?在玩弄它时,显示哪些部分是字符串以及哪些部分是应该实现的变量似乎很重要。但我不确定它是如何工作的,因为"&lt;span class=\" 包括\"+name+"\" 似乎在" " 之间。为什么包含一个\ 而在" " 之间单独包含一个?

【问题讨论】:

    标签: javascript regex google-apps-script web-scraping parameters


    【解决方案1】:

    这个修改怎么样?

    修改点:

    • 当您想使用变量创建正则表达式时,请使用RegExp
    • 虽然我不确定您要使用的 URL,但是当从 URL 检索到的值与正则表达式不匹配时,html.match(found) 变为 null。在这种情况下,您的脚本会发生错误。所以我对此进行了修改。

    当你的脚本被修改后,变成如下。

    修改脚本:

    function importval(url, name) {
      var found, html, content = '';
      var response = UrlFetchApp.fetch(url);
      found = new RegExp("<span class=\""+name+"\">([\\d.]*).*<\\/span>");  // <--- Modified
      if (response) {
        html = response.getContentText();
        if (html) {
          content = html.match(found);  // <--- Modified
          if (content && content.length == 2) {  // <--- Added
            content = content[1];
          }
        }
      }
      return content;
    }
    
    • namesurligneorange 时,正则表达式变为/&lt;span class="surligneorange"&gt;([\d.]*).*&lt;\/span&gt;/
    • 我可以确认,当urlname 分别为https://www.fundsquare.net/security/summary?idInstr=275136surligneorange 时,31.15 被检索到。
    • 在这个修改后的脚本中,当从 URL 中检索到的值与正则表达式不匹配时,返回 null

    注意:

    • 虽然您在问题中已经提到,但我也认为您要使用的所有 URL 可能无法用于此脚本。我很担心这个。

    参考:

    补充:

    关于你的附加问题,我想回答如下。

    在这种情况下,作为一种简单的理解方式,检查found的值如何?在现阶段,现在已经发现/&lt;span class="surligneorange"&gt;([\d.]*).*&lt;\/span&gt;/是正确的值。

    namesurligneorange

    • found = new RegExp("&lt;span class="+name+"&gt;([\d.]*).*&lt;\/span&gt;");found如下。

      • /&lt;span class=surligneorange&gt;([d.]*).*&lt;\/span&gt;/
    • found = new RegExp("&lt;span class=\""+name+"\"&gt;([\\d.]*).*&lt;\\/span&gt;");found如下。

      • /&lt;span class="surligneorange"&gt;([\d.]*).*&lt;\/span&gt;/
      • 这与正确的值相同。

    在这种情况下,&lt;\/span&gt;&lt;\\/span&gt; 是相同的结果。

    this document,可以看到When using the constructor function, the normal string escape rules (preceding special characters with \ when included in a string) are necessary.

    【讨论】:

    • 再次感谢 cmets。它适用于我想从这个网站检索的所有信息。我将看看如何使它适用于其他网站。我添加了一个问题以准确了解您所做的更改!
    • @Mees牟文 谢谢回复。我很高兴你的问题得到了解决。关于您的其他问题,我将答案添加到我的答案中。你能确认一下吗?
    • 好的,谢谢。我现在明白为什么它很重要,但需要更多地学习一般表达的规则。我这周的目标至少达到了。我将通读一些文档以更好地了解正则表达式的工作原理。你已经让我走了很远,所以感谢你的时间!我可能会在不久的将来回来!
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多