André Levy
André Levy

Reputation: 329

Google app script regex syntax

What the hell is wrong with this?? For the life in me I can't figure it out.

link = item.getChild("link", atom).getAttribute("href").getValue().replaceText("(https:\/\/www\.google\.com\/url\?rct=j&sa=t&url=|&ct=ga.*)","");

I've tried all sorts of permutations. 'item' is a child in an xml from an atom file:

item = items[i];

This, for instance, works:

link = item.getChild("link", atom).getAttribute("href").getValue().replace("https://www.google.com/url?rct=j&sa=t&url=","");

The goal here, as it might've become apparent, is to get rid of Google's crapware around the results it yields in an alerts feed. I also tried:

link = item.getChild("link", atom).getAttribute("href").getValue().replace("https://www.google.com/url?rct=j&sa=t&url=","").replaceText("&ct=ga.*","");

No avail. And also:

link = item.getChild("link", atom).getAttribute("href").getValue().replace("https://www.google.com/url?rct=j&sa=t&url=","");
link = link.replaceText("&ct=ga.*","");

Nope, not that either. What gives? To make matters worse, some caching is going on and doesn't really help testing the script. That, btw, is here.

Upvotes: 1

Views: 1138

Answers (1)

JSDBroughton
JSDBroughton

Reputation: 4034

Apps Script is JavaScript which deals with Regular Expressions in a specific way. Likewise the String.replace() function also works in two particular ways — string replacement and regex match replacement. You are trying to use regex in the string replacement manner.

Cf. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/replace

You need to use the .replace(pattern, replacement) version. pattern here is a regex object and not a string. Define the pattern object right there in the method or as a separate declaration (new RegExp())

Cf. https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions

Tldr; To define a regex object inline use / to enclose it and not ".

So:

/(https:\/\/www\.google\.com\/url\?rct=j&sa=turl=|&ct=ga.*)/ which I don't think will work for you in any case.

Try matching and not removing what you don't what you want to extract and not removing what you don't.

link = (function (link) {
  var match = link.match(/#.*[?&]url=([^&]+)(&|$)/);
  return(match ? match[1] : "");
}(item.getChild("link", atom).getAttribute("href").getValue());

Upvotes: 1

Related Questions