web-dev-qa-db-ja.com

Googleスプレッドシートで別のシートへの参照を自動更新するにはどうすればよいですか?

外部アプリケーションを使用して、Googleスプレッドシートにデータを入力しています。このワークブックは、データを操作および解釈する別のワークブック(IMPORTRANGE(spreadsheet_key, range_string)関数付き)によって参照されます。私の問題は、参照されているワークブックを個人的に変更するたびに、参照するワークブックは正常に更新されるが、外部アプリケーションがそれを変更するたびに更新されないことです。

「スプレッドシートの設定」を編集して、毎分、変更ごとに再計算が行われるようにしました。さらに、Google Chromeにもページを1時間ごとに自動更新する拡張機能をインストールしました。ただし、参照されているワークブックからデータは再インポートされません。数式を新しいセルにコピーしても、データは再インポートされません。

Googleスプレッドシートをトリガーしてデータを再インポートするために、参照ワークブックに対してできることはありますか?

編集:明確にするために、私は現在、外部アプリケーションによって入力されたデータを含むワークブックを1つ持っています(「ソースシート」と呼びます)。 IMPORTRANGE関数を含む別のワークブック(「参照シート」と呼びます)。 「参照シート」のIMPORTRANGE関数で表示されるデータには、「ソースシート」を最後に個人的に編集したため、外部アプリケーションによって入力されたデータは含まれません。また、両方のワークブックが新しいGoogleスプレッドシートを使用しています。

編集:また、この質問は Googleスプレッドシートのセルを別のドキュメントのセルにリンクするにはどうすればよいですか? スプレッドシートからデータをインポートするために、その質問に対する解決策として指定された関数を使用しているため。問題は、データをインポートする方法ではなく、データのソースを更新する方法です。私の想定では、Googleがこれを処理してくれますが、「参照シート」のデータは更新されず、更新するために見つけることができる唯一の方法は、「ソースシート」に物理的に移動することです「自分で編集します。

19
tlewis3348

私は同じ問題に苦しんでいます。カスタム関数を作成する代わりに、IMPORTRANGEspreadsheet_urlに別のクエリ文字列を追加して、ページが更新されるたびに、Googleが新しいスプレッドシートからデータを取得する必要があると考えます。 URLを毎回一意にするために、新しいタイムスタンプを追加するだけです。それは露骨なハックですが、私にとっては多くのシートで機能しています。

私の式は以前は次のように見えました。

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174","'Sheet1'!A1:B25")

そして今、それは次のようになります:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174"&"?"&now(),"'Sheet1'!A1:B25")

更新:

Googleはnow()内でimportrange()を許可しなくなったため、この方法は機能しなくなりました。以下のヒューからのコメントを参照してください。

14
Sam Collins

以下は this Web Apps answer のJimmyからのものです。

  1. 両方のスプレッドシートで、ランダムなセルに=now()方程式を挿入します。たとえば、Z1
  2. 両方のスプレッドシートに、他のスプレッドシートのnow関数を参照する=importrange()関数を挿入します。
  3. スプレッドシートの設定に移動し、毎分再計算することを選択します。

=now()関数、このスレッドの現在のURLトリック、または設定された間隔でランダムテキストを挿入するAppsスクリプトの使用など、他の多くの提案を試みましたが、ソースシート。

5
Tony

最も簡単な方法は、ifを単純なimportrangeステートメントで囲むことでした。

B1 = Sheet ID
B2 = Sheet Name and Range
B3 = Now()
=if (B3> now()-1, IMPORTRANGE(B1,B2),)

これは毎回機能します。

4
Brett Hawthorne

日付スタンプの回避策は私にとってはうまくいかないようです-日付スタンプとランド関数の使用は許可されていないという明示的な注意事項があります。

私の非常にハックな回避策は、セルを削除してからctrl + zを押すことです。毎回強制的に更新されます。このonopenをスクリプト化するのは簡単で、特定の時間間隔でデータを最新に保つのは簡単です。

3
Tom McGuinness

または...単純なスクリプトを作成し、最初に値cero(0)を指定してから、式を戻し、これでトリックを実行できます。

  var cell = sheet.getRange("B1:B1"); //SHEET TO INSERT VALUE
  cell.setFormula("=0");
   Utilities.sleep(2000); //JUST TO GIVE TIME TO UPDATE (OPTIONAL)
  var cell = sheet.getRange("B1:B1");
  cell.setFormula("=ImportRange(\"YOUR_SHEET_ID\",\"RANGE_TO_INSERT\")");  
2
Samuel Félix

手動のセル更新をシミュレートし、外部スプレッドシートで変更を開始する簡単なハックを見つけました。

  1. 次のようなカスタム関数を作成しました:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.Push(value);
      return list;
    }
    
  2. 次に、私のシートでこのように呼び出します:

    =arrayformula(hack(tab!B1))
    

    ここで、tab!B1は、コードで変更するセルの1つです。

2
javi

now()ロードブロッキングの回避策として、スプレッドシートの設定を変更して1時間ごとに更新できます。

ファイル->スプレッドシート設定->計算

シートを更新して、「変更時および毎時」または「変更時および毎分」で再計算します。念頭に置いて、1分ごとに再計算を選択すると、スプレッドシートがハングアップする場合があります。

1
Nikhil Sahu

カスタム関数を備えたAppsスクリプトを使用して、問題を解決する方法を見つけることができました(詳細は here )。

スプレッドシートの=IMPORTRANGE(spreadsheet_url, range_string)=DynamicImportRange(spreadsheet_url, sheet_name, range)に置き換え、以下のコードを[ツール]-> [スクリプトエディター]-> [空のプロジェクト]に貼り付けると、動作するはずです(詳細は this を参照してください)アプリスクリプトの作成に関する情報)。

/**
Usage: =DynamicImportRange(spreadsheet_url, sheet_name, range)
Compare to: =IMPORTRANGE(spreadsheet_url, range_string)

Where the given arguments are placeholders that should be replaced
by arguments specific to your use-case.
 */
function DynamicImportRange(sheet_url, sheet_name, sheet_range) {
  var values = SpreadsheetApp.openByUrl(sheet_url).getSheetByName(sheet_name).getRange(sheet_range).getValues();
  return values
};

/**
*/
function RefreshSheet() {
  // Update the following two variables to suit your particular situation
  var sheet_name = "sample_sheet_sheet"
  var range = "A1"

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
  var formula1 = "Loading...";
  var formula2 = sheet.getRange(range).getFormula().toString().replace('"', '\"');
  // The following assumes that the data is being inserted into the sheet in the same
  // location as it is in in the source sheet.
  var form_range = formula2.split(",")[2].split("\"")[1];
  sheet.getRange(form_range).clear();
  sheet.getRange(range).setValue(formula1);
  Utilities.sleep(245);
  sheet.getRange(range).setValue(formula2);
};

シートを定期的に更新する場合は、[アプリ]スクリプトウィンドウで[リソース]-> [現在のプロジェクトのトリガー]に移動して、トリガーを設定できます。

1
tlewis3348

Googleスプレッドシートアドオン Sheetgo を使用して、別のシートから参照を自動的に更新できます。 1か月あたり30のアップデートを無料で使用することも、有料のサブスクリプションを取得してさらにアップデートすることもできます。 このビデオ では、基本的な使用方法を説明しています。

0
orschiro