web-dev-qa-db-ja.com

シートを開くたびにImportXMLデータがリロードされる

Googleスプレッドシートでシートを開くたびにIMPORTXMLデータを更新する際に問題があります。

Importxml関数は、Googleスプレッドシートを開くたびに実行されますか?これをオフにする方法はありますか?シートを開くたびにデータが更新されるのは望ましくありません。更新をいつ行う必要があるかを制御する方法が必ずあるはずです。

3
HopeKing

ImportXMLの自動更新を無効にする組み込みの方法はないと思いますが、ここに回避策があります。スクリプトエディターに以下のスクリプトを入力します。スプレッドシートを次に開いたときに、[カスタム]> [インポートしたデータを更新]という新しいメニュー項目が追加されます。

ImportXML数式をシートの最初の行に配置し、それらの前にバックティックを付けて、すぐに認識されないようにします。

`=importXML("http://cnn.com", "//div")

これはそれ自体では何もしません。ただし、「インポートされたデータを更新する」コマンドが実行されると、実際の数式(バックティックなし)が1行下に配置されるため、実行されます。その後、シート上のすべての数式が出力に置き換えられます。特に、アクティブなimportXML式は残りません。元の逆ティックされた数式はそのままであるため、同じメニュー項目を使用するだけでデータを再度更新できます。

function onOpen() {
  var menu = [{name: "Update imported data", functionName: "update"}];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu);
}

function update() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  range.offset(1, 0).clear();
  var values = range.getValues()[0];
  for (var j=0; j<values.length; j++) {
    if (/^`=import/i.test(values[j])) {
      range.getCell(1, j+1).offset(1, 0).setFormula(values[j].slice(1));
    }
  }
  SpreadsheetApp.flush();
  var range = sheet.getDataRange().offset(1, 0);
  range.copyTo(range, {contentsOnly: true});
}

制限事項

出力を更新するとき、スクリプトは最初の行の下のすべてを消去して、新しいデータのためのスペースを作ります。したがって、このシートにはimportXML以外の多くのものを含めることはできません。残りのロジックを他のシートに配置します。

または、スクリプトを変更して最初のN行が影響を受けないようにし、N + 1で始まる行をインポートデータに使用できます。

3
user79865