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()+'","'
スクリプトの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()+'"'));
}