web-dev-qa-db-ja.com

「見ていません」のときにリンクされたGoogleスプレッドシートを自動更新するにはどうすればよいですか

私の質問はこれに似ていますが、まだ回答が投稿されていません。 Googleスプレッドシートで別のシートへの参照を自動更新するにはどうすればよいですか?

1つのGoogleスプレッドシートにZapierを入力して、新しいデータ行を作成します。次に、ImportRangeを使用して、そのシートのデータを別のシートに取り込み、そこで処理して、電子メールまたはSMSの送信に使用するテキストを生成します。

この2枚目のシートは、メールまたはSMSを送信するためにZapierによって読み取られます。

問題は、変更を行うためにログインしていない場合、2番目のシートが自動的に更新されないことです。つまり、importrange()は「私が見ていないとき」を更新していません。

両方のシートを毎分更新するように設定しており、Zapierは5分ごとに1回「読み取り」ます(最初のシートへの書き込み、2番目からの読み取りのみ)。

スクリプトを試しましたが、importrange()によってプルされたデータを修正するためにNow()関数とconcatenate()関数を使用しようとしましたが、問題は修正されませんでした。

2番目のシートは少し複雑で、ロードに時間がかかります。

2
user70699

カスタム関数を備えた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)
 */
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 = "sheet1"
  var range = "A1"

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
  var formula1 = "Loading...";
  var formula2 = sheet.getRange("range").getFormula().toString().replace('"', '\"');
  // Note that the following command will delete everything on the sheet.
  // If you do not want to do this, you may need to get creative
  // with how you specify what gets deleted.  You could potentially split
  // out the last argument of "formula2" to find the range that needs cleared.
  sheet.clear();
  sheet.getRange("range").setValue(formula1);
  Utilities.sleep(245);
  sheet.getRange("range").setValue(formula2);
};

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

3
tlewis3348

常にTRUEの条件式でIMPORTRANGEを使用することもできます。

=if(now()>0;IMPORTRANGE("1IyAx_*****************************************Lza5x1iVfs"; "Masterlist!AT1:TA39");"CRASH")

さらに、スプレッドシートのパラメーターで、毎分更新を追加できます。 IMPORTRANGEは少なくとも1分ごとに更新されます。

2
R.G

両方のスプレッドシートで、NOWセルを使用して更新ループを作成し、両方のスプレッドシートが相互のNOWセルを相互参照することで、この問題を回避しました。

元のシートにフォームの送信などが追加されると、独自のNOWセルが更新され、独自のIMPORTRANGEセルが再更新されます。 2番目のスプレッドシートも同様に、独自のNOWセルを更新して、元のシートに正しいデータを提供します。 2番目のスプレッドシート自体が更新されたため、最初に表示するデータを更新するメインIMPORTRANGEと、IMPORTRANGEを取得するNOWセルも更新します。元のスプレッドシートのセル

少なくとも、それがどのように機能するかはかなり確信しています。私が知っていること、そして私が気にかけていることは、率直に言って、それが機能することです

0
Jimmy