J'utilise importxml pour extraire les prix de plusieurs sites Web. Ma principale préoccupation est de pouvoir actualiser les prix à tout moment et de ne pas dépendre de la mise à jour horaire de Google. J'utilise ce script pour ajouter un horodatage à la fin de l'URL afin que Google soit obligé de procéder à une nouvelle extraction chaque fois.
function onOpen() {
var e = SpreadsheetApp.getActiveSpreadsheet();
var t = [{
name: "Refresh This Sheet",
functionName: "Refresh"
}, {
name: "Refresh All Sheets",
functionName: "RefreshAll"
}];
e.addMenu("Looker", t)
}
function onInstall(e) {
onOpen(e)
}
function Refresh(e) {
var t = SpreadsheetApp.getActiveSheet();
if (typeof e !== "undefined") {
t = e
}
var n = t.getDataRange();
var r = find("importxml", n);
for (var i = 0; i < r.length; i++) {
r[i].setValue(r[i].getFormula().replace(/"[^"]"/, "?apply_formatting=true&refresh=" + Date.now() + '","'))
}
}
function RefreshAll() {
var e = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var t = 0; t < e.length; t++) {
Refresh(e[t])
}
}
function find(e, t) {
var n = t.getFormulas();
var r = [];
for (var i = 0; i < n.length; i++) {
for (var s = 0; s < n[i].length; s++) {
if (n[i][s].indexOf(e) > -1) {
r.Push(t.getCell(i + 1, s + 1))
}
}
}
return r
}
J'utilise la fonction refresh pour mettre à jour les valeurs, mais le problème est que cela ne remplace pas l'horodatage à la fin de l'URL; au lieu de cela, il crée un horodatage unique et l'ajoute à l'URL à chaque fois.
Qu'est-ce que j'oublie ici? Je crois que je n'utilise pas correctement les opérateurs.
replace(/"[^"]"/,"?apply_formatting=true&refresh="+Date.now()+'","'
Un problème avec votre script est que l'expression régulière /"[^"]"/
ne correspond qu'à un seul caractère entre guillemets doubles. Pour remplacer plus de caractères entre guillemets, utilisez plutôt /"[^"]*"/
. Le site regex101 est très utile pour le débogage des expressions régulières.
De plus, je ne vois pas très bien la logique de ce remplacement: il me semble que cela tuerait le nom d'hôte du site Web et ne ferait pas que modifier le paramètre. Enfin, je ne vois pas pourquoi la formule mise à jour est définie avec .setValue
au lieu de setFormula
.
Voici un remplacement qui fonctionne. Supposons qu'il s'agisse d'une formule de votre feuille de calcul que vous souhaitez mettre à jour, par exemple dans la cellule F2.
=importxml("http://example.com?apply_formatting=true&refresh=1234567890987", "//div[42]")
Voici une fonction qui le met à jour:
function update() {
var sheet = SpreadsheetApp.getActiveSheet();
var cell = sheet.getRange("F2");
cell.setFormula(cell.getFormula().replace(/\?[^"]*"/, '?apply_formatting=true&refresh='+Date.now()+'"'));
}