Javascript 谷歌应用程序脚本-XML解析器-正则表达式

Javascript 谷歌应用程序脚本-XML解析器-正则表达式,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我使用的是一个谷歌应用程序脚本,它从一个表单中的提要中提取内容 这是我正在使用的代码: function processXML(FeedURL,sheetsFileDestinationURL,rawPasteSheetName,OPT_childNamesArray,OPT_Namespace){ var OPT_childNamesArray = ["link"]; // get only item url from the feed var GoogleSheetsFile

我使用的是一个谷歌应用程序脚本,它从一个表单中的提要中提取内容

这是我正在使用的代码:

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++;
    }
  }
}
基本上,正则表达式只应用于第一个url

如何使正则表达式应用于所有url


有什么帮助吗?
感谢您使用for对exportRow数组进行迭代,但是稍后,您不会在for中使用k迭代器

然后,您不会访问exportRows数组,只访问第一个位置:

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

      var URL = exportRows[k].toString().replace(re, replacingItem);
在这种情况下,它将不起作用,因为它不是一个数组,所以通过这样做,您只保存在URL上for迭代器上生成的最后一个赋值,我相信您正在尝试执行以下操作:

  for ( k=0; k < exportRows.length; k++) {
    var re = '115-396/'
    var replacingItem = '';
    exportRows[k] = exportRows[k].toString().replace(re, replacingItem);
  }
但是,exportRows的范围应该与getRange选择的范围相匹配,我不确定是否发生了这种情况

为了澄清这一点,
exportRows.length
是数组的长度,
exportRows[1]
是存储在数组位置1上的字符串/url的长度

希望这有帮助,问题也不是很清楚的意图,提供更多的信息,如果仍然不工作


如何知道你得到的产品的尺寸

   var myrange = GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length)
   Logger.log(myrange.getNumRows());
   Logger.log(myrange.getNumColumns());
您将能够知道getRange上的范围,并使其与exportRows大小匹配


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

我认为提供
feedContent
XMLFeedURL
的示例值以复制您的问题将帮助用户思考问题和解决方案。当然,请删除您的个人信息。谢谢您的帮助@Yuri。我尝试了您的代码,得到了您所说的错误:exportRows的范围与getRange选择的范围不匹配。我试图解决此问题,请参见编辑我的问题,但仍不起作用。已更新,如果您有更多疑问,请打开新问题。
      var URL = exportRows[k].toString().replace(re, replacingItem);
  for ( k=0; k < exportRows.length; k++) {
    var re = '115-396/'
    var replacingItem = '';
    exportRows[k] = exportRows[k].toString().replace(re, replacingItem);
  }
GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length).setValues(exportRows);
   var myrange = GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length)
   Logger.log(myrange.getNumRows());
   Logger.log(myrange.getNumColumns());