Google Apps脚本-XML分析器-正则表达式

我正在使用Google Apps脚本从工作表中的Feed中提取内容。

这是我正在使用的代码:

function processXML(FeedURL,sheetsFileDestinationURL,rawPasteSheetName,OPT_childNamesArray,OPT_Namespace){

   var OPT_childNamesArray = ["link"]; // get only item url from the feed

  var GoogleSheetsFile = Spreadsheetapp.openByUrl(sheetsFileDestinationURL);
  var GoogleSheetsPastePage = GoogleSheetsFile.getSheetByName(rawPasteSheetName);
  if (OPT_childNamesArray){
    GoogleSheetsPastePage.getDataRange().offset(1,0).clearContent(); // get all filled cells,omitting the header row,and clear content
  }
  else {
    GoogleSheetsPastePage.getDataRange().offset(0,INCLUDING the header row,and clear content
  }

  // Generate 2d/md array / rows export based on requested columns and feed
  var exportRows = []; // hold all the rows that are generated to be pasted into the sheet
  var XMLFeedURL = FeedURL;
  var feedContent = UrlFetchApp.fetch(XMLFeedURL).getcontentText(); // get the full feed content
  var feedItems = XmlService.parse(feedContent).getRootElement().getchild('channel').getchildren('item'); // get all items in the feed
  for (var x=0; x<feedItems.length; x++){
    // Iterate through items in the XML/RSS feed
    var currentFeedItem = feedItems[x];
    var singleItemArray = []; // use to hold all the values for this single item/row

    // Parse for specific children (requires names and namespace)
    if (OPT_childNamesArray){
      for (var y=0; y<OPT_childNamesArray.length; y++){
        // Iterate through requested children by name and fill rows
        var currentChildName = OPT_childNamesArray[y];
        if (OPT_Namespace){

          if (currentFeedItem.getchild(OPT_childNamesArray[y],OPT_Namespace)){
            singleItemArray.push(currentFeedItem.getchildText(OPT_childNamesArray[y],OPT_Namespace));
          }
          else {
            singleItemArray.push("null");
          }
        }
        else {
          if (currentFeedItem.getchild(OPT_childNamesArray[y])){
            singleItemArray.push(currentFeedItem.getchildText(OPT_childNamesArray[y]));
          }
          else {
            singleItemArray.push("null");
          }
        }
      }
      exportRows.push(singleItemArray);
    }

    // Parse for ALL children,does not require knowing names or namespace
    else if (!OPT_childNamesArray){
      var allChildren = currentFeedItem.getchildren();

      if (x == 0){
        // if looking at first item,create a header row first with column headings
        var headerRow = [];
        for (var h=0; h<allChildren.length; h++){
          headerRow.push(allChildren[h].getName());
        }
        exportRows.push(headerRow);
      }

      for (var c=0; c<allChildren.length; c++){
        singleItemArray.push(allChildren[c].getText());
      }

      exportRows.push(singleItemArray);
    }
  }

  // Paste the generated md array export into the spreadsheet
  if (OPT_childNamesArray){
    GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length).setvalues(exportRows);
  }
  else if (!OPT_childNamesArray){
    var maxRangeLength = 0;
    var currentRowIndex = 1;
    for (var x = 0; x<exportRows.length; x++){
      if (exportRows[x].length > maxRangeLength){
        maxRangeLength = exportRows[x].length;
      }
      GoogleSheetsPastePage.getRange(currentRowIndex,exportRows[x].length).setvalues([exportRows[x]]);
      currentRowIndex++;
    }
  }
}

我的问题是这样

运行此代码时,我得到:

https://url/115-396/

https://url/115-396/

https://url/115-396/

我需要删除“ 115-396 /”

所以我尝试添加此代码,但是没有用:

...
  // Paste the generated md array export into the spreadsheet
  if (OPT_childNamesArray){

    for (var k = 0; k < exportRows.length; k++) {
      var re = '115-396/'
      var replacingItem = '';
      var URL = exportRows[0].toString().replace(re,replacingItem);
    }

    GoogleSheetsPastePage.getRange(2,exportRows[1].length).setvalue(URL);

  }
  else if (!OPT_childNamesArray){

...

在@Yuri回复后编辑:

  // Paste the generated md array export into the spreadsheet
  if (OPT_childNamesArray){

 for ( k=0; k < exportRows[0].length; k++) {
    var re = '115-396/'
    var replacingItem = '';
    exportRows[0][k] = exportRows[0][k].toString().replace(re,replacingItem); 
  }

      GoogleSheetsPastePage.getRange(2,exportRows[1].length).setvalues(exportRows);

  }

结果:

https://url/

https://url/115-396/

https://url/115-396/

基本上,正则表达式仅应用于第一个网址。

如何使正则表达式适用于所有网址?


有帮助吗? 谢谢

z442820293 回答:Google Apps脚本-XML分析器-正则表达式

您正在使用for来通过exportRow数组进行迭代,但是稍后,您将不会使用for内的k迭代器。

然后,您将不访问exportRows数组,而仅访问第一个位置:

      var URL = exportRows[0].toString().replace(re,replacingItem);

不是吗?

      var URL = exportRows[k].toString().replace(re,replacingItem);

在这种情况下,它将无法工作,因为URL不是数组,因此,您仅将在for迭代器上生成的最后一个赋值保存在URL上,我相信您正在尝试执行以下操作:

  for ( k=0; k < exportRows.length; k++) {
    var re = '115-396/'
    var replacingItem = '';
    exportRows[k] = exportRows[k].toString().replace(re,replacingItem);
  }

您将拥有exportRows作为所需URL的数组,且没有115-396扩展名。

现在,您可以像以前一样使用setValue将其放置在电子表格中,但是setValue用于字符串,整数等,而不用于数组。对于数组,您有setValues()

GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length).setValues(exportRows);

但是,exportRows的范围应该与您选择的getRange的范围相匹配,我不确定这种情况是否正在发生。

为澄清起见,exportRows.length是数组的长度,exportRows[1]是存储在数组位置1上的字符串/ URL的长度。

希望这会有所帮助,但问题并没有真正弄清意图,如果仍然无法解决,请提供更多信息。


如何知道您得到的range的大小?

   var myrange = GoogleSheetsPastePage.getRange(2,exportRows[1].length)
   Logger.log(myrange.getNumRows());
   Logger.log(myrange.getNumColumns());

您将能够知道getRange上的范围,并使它与exportRows大小匹配。

请务必检查随附的文档,以防万一,请打开与之相关的新问题。

本文链接:https://www.f2er.com/3113630.html

大家都在问