web-dev-qa-db-ja.com

配列数式内でIMPORTRANGEを使用し、これを動的にする方法はありますか?

私は、同じ寸法の別のシートの範囲からスプレッドシートIDを取得し、それらを使用してそれらのIDを持つスプレッドシートからデータを取得しようとしています。配列数式を使用して、必要なデータを次の基準で列に自動入力します。

  • スプレッドシートIDが空の場合、「ID欠落」を返します
  • 親スプレッドシートで変更された値を更新します

だから私はこのようなスプレッドシートを持っているとしましょう:

  \ __A__|__B__|__C__
_1_|_ID1_|_____|_____
_2_|_ID2_|_____|_____
_3_|_ID3_|_____|_____

これらの各IDは、次のようなスプレッドシートにつながります。

  \ __A__|__B__|__C__
_1_|DATE1|_____|_____
_2_|DATE2|_____|_____
_3_|DATE3|_____|_____

IDスプレッドシートの列Aを別のシートからインポートし、インポートした範囲でIMPORTRANGEを実行して日付を取得します。次の式(IMPORTRANGEのフィラー引数)を試しました。

    =ARRAYFORMULA(IF(ISBLANK(IMPORTRANGE(ABC, DEF)), "ID missing", IMPORTRANGE(IMPORTRANGE(ABC, DEF), GHI)))

欠落しているIDを持つすべてのフィールドに適切に入力されます。ただし、IDを持つものにはすべて同じ値(正確にはIMPORTRANGEによって返される最初の値)が入力されます。最初のセルに何度も繰り返し適用されているようです。 INDEX、VLOOKUP、OFFSET、QUERYを試しましたが、ARRAYFORMULAで動作するものはないようです。

現時点では、カスタム関数とかなり奇妙な引数の組み合わせを使用して関連データを取得することに頼っています(各範囲で最新の日付を見つける必要があります)。 Google Apps Scriptのカスタム関数は次のとおりです。

/**
 * Imports a range from each spreadsheet given an array of spreadsheet IDs
 *
 * @param {range} IDs An array of spreadsheet IDs
 * @param {string} Range The range to import from each spreadsheet
 * @param {[string]} JavaScript Optional JavaScript code to run on the returned values
 * @return The desired range
 * @customfunction
 */
function IMPORTRANGES(IDs, Range, JavaScript) {
  return IDs.map(function (ID) {
    if (ID[0]) {
      var Values = SpreadsheetApp.openById(ID[0]).getRange(Range).getValues();
      return JavaScript ? function () { return eval(JavaScript); }.call(Values) : Values;
    }
  });
}

そして、私の式は次のように変わります。

=ARRAYFORMULA(IF(ISBLANK(IMPORTRANGE(ABC, DEF)), "Log missing", IMPORTRANGES(IMPORTRANGE(ABC, DEF), "Dates", "new Date(Math.max.apply(null, this.filter(function () { return arguments[0][0] instanceof Date; }).map(function () { return arguments[0][0]; })))")))

今では完全に機能しますが、問題はすべての処理がカスタム関数を介して行われるため、結果がキャッシュされ、それぞれのスプレッドシートの変更を反映するために自動的に更新されないことです。

IMPORTRANGEを配列数式で使用する方法は本当にありませんか?

可能であれば、インストール可能なGASトリガーの使用を避けたいと思います。

1
Hao Zhang

配列数式内でIMPORTRANGEを使用する方法は実際にはありません。IMPORTDATAとIMPORTXMLには使用できません。 answer to Googleスプレッドシート:複数のURLの複数のImportXML結果を1つの列に結合するにはどうすればよいですか? を参照してください。

別の関連する質問:

2
Rubén