web-dev-qa-db-fra.com

Mise à jour périodique d'une URL dans la commande ImportXML avec un script

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()+'","'
2
user1314051

Problèmes

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.

Solution

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()+'"'));
}
1
user79865