繁体   English   中英

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

[英]Google Apps Script - XML Parser - Regex

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

这是我正在使用的代码:

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,0).clearContent(); // get all filled cells, 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,1,1,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,1,exportRows.length,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,1,exportRows.length,exportRows[1].length).setValues(exportRows);

  }

结果:

https://url/

https://url/115-396/

https://url/115-396/

基本上,正则表达式仅适用于第一个 url。

我怎样才能使正则表达式应用于所有网址?


有什么帮助吗? 谢谢

您正在使用 for 遍历 exportRow 数组,但稍后,您不会在 for 中使用 k 迭代器。

然后,您没有访问 exportRows 数组,只访问第一个 position:

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

不应该吗?

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

在这种情况下,它不会起作用,因为 URL 它不是一个数组,所以通过这样做,您只会保存在 URL 上的 for 迭代器上生成的最后一个分配,我相信您正在尝试执行以下操作:

  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用于字符串、整数等,而不用于 arrays。 对于 arrays 你有setValues()

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

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

澄清一下, exportRows.length是数组的长度, exportRows[1]是存储在数组的 position 1 上的字符串/url 的长度。

希望这会有所帮助,问题也不是很清楚,意图也不是很清楚,如果仍然无法正常工作,请提供更多信息。


如何知道你得到的范围的大小?

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

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

请务必检查随附的文档,如果您有更多疑问,请打开一个与之相关的新问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM