私は、同じ寸法の別のシートの範囲からスプレッドシート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トリガーの使用を避けたいと思います。
配列数式内でIMPORTRANGEを使用する方法は実際にはありません。IMPORTDATAとIMPORTXMLには使用できません。 answer to Googleスプレッドシート:複数のURLの複数のImportXML結果を1つの列に結合するにはどうすればよいですか? を参照してください。
別の関連する質問: