如何在 Google Apps 脚本/Javascript 中获取一列 URL?

问题描述 投票:0回答:1

我有一个客户站点列表,我想不断检查它们是否安装了我们的 GTM 容器标签。 我无法将电子表格连接到我们的 GTM,因为我公司的通用登录名与我用于电子表格的 Google 帐户不同,而且我无法将自己的个人标签添加到容器中时间。 我让它一次在一个站点上完美运行,更改脚本中的单元格,但当我尝试让它检查所有站点时,我似乎无法让它运行。我还希望它在不从脚本编辑器运行的情况下循环。似乎使用 array.map 可以同时解决这两个问题,但我就是不知道如何使用它。我对这一切还是很陌生。 这是我针对各个站点的工作代码(url 列和 gtm 列是 Xlookups,但如果 xlookups 不起作用,我可以参考实际数据):

function verifyGTM() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('February 2023 Paste');
  var urlRange = s.getRange(5,10);
  var gtmRange = s.getRange(5,11);
  var url = urlRange.getDisplayValues();
  var gtmID = gtmRange.getDisplayValues();
  var str = UrlFetchApp.fetch(url).getContentText();
  const mainRegex = /<!-- Google Tag Manager -->([\s\S]*?)<!-- End Google Tag Manager -->/gi;
  var results = str.match(mainRegex);
  
    Logger.log(results)
    if(str.includes("GTM") && str.includes(gtmID) && !gtmID == "N/A"){
      s.getRange(5,12).setValue("Yes");
    }
    else if(str.includes("GTM") && !str.includes(gtmID)){
      s.getRange(5,12).setValue("Incorrect GTM");
    }
    else if(gtmID == "N/A"){
      s.getRange(5,12).setValue("No GTM");
    }
    else {
      s.getRange(5,12).setValue("No");
    }
    
    

}

这是一个删除了一些敏感数据的示例电子表格:https://docs.google.com/spreadsheets/d/10xgrGVbIiPJiYis3jkBsoyzAUkudOjLLKgYRMGPVsYQ/edit?usp=sharing

我有一些 onEdit 脚本在运行,但我认为这些不会影响这个。

我尝试使用 fetchAll,如下所示:

function verifyGTM() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('February 2023 Paste');
  var urlRange = s.getRange("J:J");
  var gtmRange = s.getRange("K:K");
  var url = urlRange.getDisplayValues();
  var gtmID = gtmRange.getDisplayValues();
  var str = UrlFetchApp.fetchAll(url).getContentText();
  const mainRegex = /<!-- Google Tag Manager -->([\s\S]*?)<!-- End Google Tag Manager -->/gi;
  var results = str.match(mainRegex);
  
    Logger.log(results)
    if(str.includes("GTM") && str.includes(gtmID) && !gtmID == "N/A"){
      s.getRange("L:L").setValue("Yes");
    }
    else if(str.includes("GTM") && !str.includes(gtmID)){
      s.getRange("L:L").setValue("Incorrect GTM");
    }
    else if(gtmID == "N/A"){
      s.getRange("L:L").setValue("No GTM");
    }
    else {
      s.getRange("L:L").setValue("No");
    }
    
    

}

我收到了这个错误: Exception: 服务在短时间内调用了太多次:urlfetch。在通话之间尝试 Utilities.sleep(1000)。

我试着把 utilities.sleep 放进去,但那也没用。

google-apps-script google-sheets web-scraping google-tag-manager urlfetch
1个回答
0
投票

获取列:

function fetchAColumn() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("Sheet Name");
  const col1 = sh.getRange(1,1,sh.getLastRow()).getValues();
  //col1 is a column of values as a two dimensional array
}

试试这个:

function fetchAColumn() {
  const ss = SpreadsheetApp.getActive();
  const c = 1; //column number
  const sr = 2; //data start row
  const sh = ss.getSheetByName("Sheet Name");
  const col1 = sh.getRange(sr,c,sh.getLastRow() - sr + 1).getValues().flat();
  //col1 is a column of values as a flattened array
}

如果你想用逗号将它们组合起来,你可以使用 join 方法。如果您在某些情况下缺少 url,那么我会使用 filter 方法删除这些行。您没有提供有关数据的任何详细信息,我也没有点击其他电子表格的链接。

© www.soinside.com 2019 - 2024. All rights reserved.