· シン · gas-spreadsheet  · 10 min read

IMPORTFEED関数を定期更新させる方法。キャッシュの罠をGASで突破する裏ワザ

便利だけど最新データに更新されない…そんなIMPORTFEED関数の「キャッシュの罠」と「画面を閉じると眠る仕様」を突破。関数を維持したまま裏側で強制更新させるGASの仕掛けを解説します。

便利だけど最新データに更新されない…そんなIMPORTFEED関数の「キャッシュの罠」と「画面を閉じると眠る仕様」を突破。関数を維持したまま裏側で強制更新させるGASの仕掛けを解説します。

こんにちは、e-Shikumi-Laboのシンです。 このブログでは、スプレッドシート&GASやChrome拡張機能をはじめとする、自動化のTipsを紹介しています。

前回は、スプレッドシートとGeminiを組み合わせて「日米ITトレンドボード」を作る方法をご紹介しました。今回は、そのシステムをさらに実用的に運用するための「自動更新」について考えていきます!

Web上の最新情報を自動で集めるのに非常に便利なIMPORTFEED関数。手軽にRSSフィードを取得できて重宝するのですが、使っていると誰もが「あれ?データが最新に更新されない…」という壁にぶつかります。

そこで今回は、なぜIMPORTFEED関数が更新されないのか、Googleの公式仕様や海外コミュニティ(Redditなど)の情報を手がかりにその原因を突き止め、「関数を維持したまま無理やり更新させる裏ワザ」を導き出してみました!

そもそもGoogleの公式仕様ではどうなってる?

まず、Googleが公式に発表しているIMPORTFEED関数を含む「IMPORT関数の共通ルール」を見てみましょう。公式ドキュメント(ヘルプID: 12188454)によると、以下のように定められています。

  • 1時間に1回の自動確認: スプレッドシートをブラウザで開いている間、シートに変更がなくても、Googleのサーバーがバックグラウンドで1時間ごとに最新データがないか確認しに行きます。

  • 開き直しやページ更新ではリフレッシュされない: 一度シートを閉じて開き直したり、ブラウザをリロードしたりしても、それだけではデータの再取得はトリガーされません。

  • 手動更新の方法: 今すぐ更新したい場合は、「対象のセルを一度削除して再度追加する」か、「同じ数式をセルに上書き入力する」ことで更新をトリガーできるとされています。

公式通りにいかない!「強力なキャッシュの罠」

しかし、海外のエンジニアコミュニティ(Reddit、Stack Overflow、Google公式開発者フォーラム)を覗くと、「公式の言う通りにセルを上書きしても、データが古いままで更新されない!」という情報が多数上がっています。

その原因は、Googleのサーバー側にある強力な「キャッシュ(一時保存)」と言われています。

セルを削除して数式を入れ直しても、指定しているURLが全く同じである場合、Googleのサーバーは「さっき取得したデータ(キャッシュ)をそのまま返せばいいや」と判断してしまいます。そのため、結果的にシートの見た目は古いデータのまま変わらない、という現象が起きてしまうのです。

対策:ダミーのクエリパラメータでキャッシュを騙す

この強力なGoogleキャッシュを避けて、強制的に最新データを取ってこさせるために開発者たちの間で使われているのが、「URLの末尾にダミーのクエリパラメータを付加する」という裏ワザです。

URLの末尾に、フィード元の動作に影響を与えない無意味な数字(タイムスタンプなど)をくっつけます。

  • 通常のURL: https://example.com/feed

  • 対策後のURL: https://example.com/feed?refresh=1719999999

こうすることで、Googleのサーバーに「さっきとは違う、新しいURLからのリクエストだ!」と認識させ、キャッシュを無視して今すぐ最新のデータをWebサイトへ取りに行かせることができます。

⚠️ ただし、RAND や NOW などの関数とは組み合わせられない!

ここで「関数だけで完結させよう」として、URLの末尾に RAND()(乱数生成)や TODAY()NOW()(現在日時)といった頻繁に値が変わる関数を結合してはいけません。

スプレッドシートの過負荷を防ぐためのGoogle側の安全制限により、これらの関数をIMPORTFEED関数内で直接・間接的に参照すると、即座に #ERROR!(この関数は〜を含むセルを参照することはできません)が発生してしまいます。

そのため、このダミークエリの値を「エラーを出さずに、安全かつ自動で変化させる」には、後述するGAS(Google Apps Script)を使って外側から数式を書き換えるアプローチが必要になります。

画面を閉じていてもGASでIMPORTFEED関数を更新する仕組み

さらに、最初の公式仕様でご紹介した通り、IMPORTFEED関数は「ブラウザで開いている間」しか自動確認をしてくれません。つまり、スプレッドシートの画面を閉じている間は、関数が完全に眠ってしまい、自動更新がストップしてしまうのです。

画面を一切開かずに毎日最新データを集めるには、この「開いていないと動かない」という制限を突破しなければなりません。

そこで、GASの出番です。人間が画面を開く代わりに、GASを定期実行し、新しい数式を上書き(更新)して関数を強制的に叩き起こすことで、画面を閉じたままでの更新を実現します。

以下が、キャッシュを突破して更新をかけるためのGASコードです。

JavaScript

function refreshImportFeedFormulas() {
  // 1. 対象のシート名を設定
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("元データ");
  
  // 2. 更新したい「元のフィードURL」と「入力先のセル」のリスト
  var targetList = [
    { url: "https://news.google.com/rss/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=ja&gl=JP&ceid=JP:ja", range: "A13" },  // 1つ目のURLとセル
    { url: "https://news.google.com/rss/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGRqTVhZU0JXVnVMVWRDR2dKSlRpZ0FQAQ?hl=en-US&gl=US&ceid=US:en", range: "F13" }  // 2つ目のURLとセル
  ];
  
  // 3. キャッシュをバイパスするために現在のタイムスタンプ(ミリ秒)を取得
  var timestamp = new Date().getTime();
  
  // 4. リストの数だけ繰り返し処理を実行
  targetList.forEach(function(target) {
    var baseUrl = target.url;
    var cell = sheet.getRange(target.range);
    
    // URLにクエリパラメータを結合
    var separator = baseUrl.indexOf('?') > -1 ? '&' : '?';
    var targetUrl = baseUrl + separator + "refresh=" + timestamp;
    
    // IMPORTFEED関数を組み立て(例:最新の5件を取得する場合)
    var formula = '=IMPORTFEED("' + targetUrl + '", "items", true, 10)';
    
    // セルに数式をセットして再計算を強制トリガー
    cell.setFormula(formula);
    Logger.log(target.range + " セルを更新しました:" + formula);
  });
}

画面を閉じていても安心!時間主導型トリガーの設定手順

上記のGASコードを、「スプレッドシートを完全に閉じている間」にも自動で実行させるために、時間主導型のトリガーを設定します。

  • ステップ①: スプレッドシートのメニューから「拡張機能」>「Apps Script」を開き、上記のコードを貼り付けて保存します。

  • ステップ②: 画面左側のメニューにある時計マーク(トリガー)をクリックします。

  • ステップ③: 右下の「トリガーを追加」ボタンを押します。

  • ステップ④: 以下のように設定します。

    • 実行する関数を選択: refreshImportFeedFormulas

    • イベントのソースを選択: 時間主導型

    • 時間ベースのトリガーのタイプを選択: 時間ベースのタイマー

    • 時間の間隔を選択: 4時間おき

  • ステップ⑤: 「保存」をクリックし、初回のみアクセスの承認(権限の許可)を行います。

これで、パソコンを閉じている間も、Googleのサーバーが裏側で1時間ごとに数式を書き換え、最新のフィードを追いかけてくれます。

まとめ

今回は「IMPORTFEED関数がどこまで自動更新に対応できるか」を検証しました。ダミークエリとGASトリガーを組み合わせることで、関数を維持したままの自動更新は可能であることが分かりました。

まずはIMPORTFEED関数の自動更新を試してみたい方は、ぜひ今回のクエリパラメータ技を試してみてください!

Back to Blog

Related Posts

View All Posts »