Добрый день. Частая задача - получать данные из других таблиц. Есть пара способов:
1) Получать данные с помощью
IMPORTRANGE(url; range). Проблема в том, что если список таблиц меняется, то формулу надо переписывать.
={
IMPORTRANGE(URL1; RANGE1);
IMPORTRANGE(URL2; RANGE2);
IMPORTRANGE(URL3; RANGE3)
}
К тому же, при добавлении строки, нужно открыть доступ к данным к другой таблице
2) Использовать скрипт, наподобие такого:
/**
* Возвращает данные из таблиц
*
* @param {A1:A10} urls Ссылки на таблицы
* @param {"Лист1!A:Z"} links Диапазоны
* @param {1} columnFilter Номер столбца по которому фильтруются пустые, нулевые и т.п. строки
* @return Возвращает данные из таблиц
* @customfunction
*/
function massImportRange(urls, links, columnFilter){
urls = (Array.isArray(urls)?urls.flat(2):[urls]).map(el=>el+"");
links = (Array.isArray(links)?links.flat(2):Array(urls.length).fill(links)).map(el=>el+"");
urls = urls.map((el,ind,arr)=>[el,links[ind]]).filter(el=>el[0]!="");
links = urls.map(el=>el[1]);
urls = urls.map(el=>el[0]);
var outData = [];
for (var iUrl=0; iUrl<urls.length; iUrl++){
try{
var ss = SpreadsheetApp.openByUrl(urls[iUrl]);
SpreadsheetApp.flush();
var sheetName = links[iUrl].split("!")[0];
var rangeName = links[iUrl].split("!")[1];
ss = SpreadsheetApp.openByUrl(urls[iUrl]).getSheetByName(sheetName);
var inData = ss.getRange(rangeName);
inData = inData.getValues();
if (columnFilter){
inData = inData.filter(row=>row[columnFilter-1]);
};
outData.push(...inData);
Logger.log(Utilities.formatString("%s - outData[%d,%d]", urls[iUrl], outData.length, outData[0]&&outData[0].length?outData[0].length:0));
}catch(err){
Logger.log(err);
};
};
return inData
};
Это рабоает, но не уверен, что это самое быстрое решение, к тому же - это нельзя вызвать как юзерфункцию, т.к. есть
SpreadsheetApp.openByUrl()
Кто как решает эту задачу? Есть ли что-то более простое (для конечного юзера) и надёжное.