web-dev-qa-db-ja.com

スクリプトを使用してImportXMLコマンドのURLを定期的に更新する

Importxmlを使用して、複数のWebサイトから価格を抽出しています。私の主な関心事は、Googleの1時間ごとの更新に依存せず、必要なときにいつでも価格を更新できることです。このスクリプトを使用して、URLの最後にタイムスタンプを追加して、Googleが毎回再取得するようにしています。

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
}

関数refreshを使用して値を更新していますが、問題はURLの最後のタイムスタンプを置き換えないことです。代わりに、一意のタイムスタンプを作成し、そのたびにURLに追加します。

ここに何が欠けていますか?私は、演算子を正しく置き換えて使用していないと思います。

replace(/"[^"]"/,"?apply_formatting=true&refresh="+Date.now()+'","'
2
user1314051

課題

スクリプトの1つの問題は、正規表現/"[^"]"/が二重引用符で囲まれた単一の文字にのみ一致することです。二重引用符の間の文字をさらに置換するには、代わりに/"[^"]*"/を使用します。サイト regex101 は、正規表現のデバッグに非常に役立ちます。

また、この置換のロジックはあまりわかりません。パラメーターを変更するだけでなく、Webサイトのホスト名を殺すように思えます。最後に、更新された数式がsetFormulaではなく.setValueで設定されている理由がわかりません。

解決

これが機能する代替品です。これが、セルF2など、更新するスプレッドシート内の数式であるとします。

=importxml("http://example.com?apply_formatting=true&refresh=1234567890987", "//div[42]")

これを更新する関数を次に示します。

function update() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell = sheet.getRange("F2");
  cell.setFormula(cell.getFormula().replace(/\?[^"]*"/, '?apply_formatting=true&refresh='+Date.now()+'"'));
}
1
user79865