Сегодня я играю с Google Apps Script и пытаюсь написать несколько пользовательских функций электронной таблицы. Я провел несколько поисков, но не смог найти ответ на свой вопрос.
Я знаю, что в электронной таблице Google можно использовать ImportRange в ячейке таблицы следующим образом:
=ImportRange(spreadsheet_key;sheet!range_of_cells)
Мои вопросы заключаются в том, можно ли сделать что-то подобное в сценарии Google Apps Script и если да, то как?
Я хочу импортировать диапазон ячеек из листа в другой электронной таблице (не из листа в таблице, где будет находиться сценарий).
Да, это вполне возможно. Вам просто нужно вызвать SpreadsheetApp.openById
и затем нормально получить нужный лист и диапазоны.
Пожалуйста, взгляните на документацию : range.getValues()
и range.setValues()
являются очень базовыми методами GAS и довольно хорошо описаны.
Прочитайте также учебник.
Похоже, что Google в своей бесконечной мудрости изменил поведение openById и подобных функций. Они больше не разрешены в контексте пользовательских функций.
Более подробную информацию см. на сайте https://code.google.com/p/google-apps-script-issues/issues/detail?id=5174.
Они предлагают использовать IMPORTRANGE в качестве обходного пути, но, как уже говорилось, ее нужно вызывать внутри ячейки.
Наше решение заключалось в использовании IMPORTRANGE в листе и передаче полученных данных в нашу пользовательскую функцию, поскольку набор данных был небольшим. Надеюсь, эта информация поможет!
Недавно мне понадобилось сделать это. Вот что я придумал, просто жестко закодировав ключ электронной таблицы и диапазон в функции ahab's myImportRange
.
// to be used in the spreadsheet like so: = myScriptedImportRange( GoogleClock() )
// no need to include key or range because they are in the script here
//
// the third parameter - GoogleClock() - triggers an automatic update every minute.
// updated 2011-07-17 (ahab): better regex to strip sheetname of *outer* single quotes
// updated 2013-01-27 (ben) to hard-code key and range
function myScriptedImportRange( ) {
var key = "PUT YOUR DATA_SPREADSHEET_ID IN HERE"
var sheetrange = "PUT YOUR SHEET AND CELL RANGE IN HERE"
var shra = sheetrange.split("!") ;
if (shra.length==1) shra[1]=shra[0], shra[0]="";
var sheetstring = shra[0].replace( /^'(.*)'$/g , "$1") // was: replace( /'/g , "") ; updated 2011-07-17 (ahab)
var rangestring = shra[1]
var source = SpreadsheetApp.openById( key )
if ( sheetstring.length==0 ) sheet = source.getSheets()[0] ;
else sheet = source.getSheetByName( sheetstring ) ;
return sheet.getRange( rangestring ).getValues();
}
В моем случае у меня есть набор личных листов, промежуточный лист, который использует обычный myImportRange
и VMERGE с некоторым SQL для объединения выборок из личных листов в промежуточный лист, а затем общий лист, который просто имеет одну ячейку, содержащую = myScriptedImportRange( GoogleClock() )
.
Обратите внимание, что здесь используется аналогичный подход: https://stackoverflow.com/a/11857014.
Обратите внимание, что функция ImportRange
и связанные с ней функции часто сталкиваются с проблемой неотображения импортированных данных, когда исходная рабочая книга (книги) не открыта. Простой способ решения этой проблемы был описан в комментарии здесь: https://stackoverflow.com/a/11786797.