Можно ли сделать ImportRange в скрипте Google Apps?

Я играл с Google Apps Script сегодня, и я пытаюсь закодировать некоторые пользовательские функции электронных таблиц. Я сделал некоторые поиски, но не могу найти ответ на мой запрос.

Я знаю, что в электронной таблице Google вы можете использовать ImportRange в ячейке электронной таблицы, как это:

=ImportRange(spreadsheet_key;sheet!range_of_cells)

мои вопросы можно ли сделать что-то подобное в скрипте Google Apps, и если да, то как?

Я хочу импортировать диапазон ячеек из листа на другой электронной таблице (не на листе электронной таблицы, где будет находиться скрипт).

3 ответов


Да, это вполне возможно. Вам просто нужно позвонить SpreadsheetApp.openById а затем получить нужный лист и диапазоны нормально.

пожалуйста, взгляните на документация : range.getValues() и range.setValues() очень основные методы газа и довольно хорошо описаны.

читать учебник как хорошо.


похоже, Google в своей бесконечной мудрости изменил поведение openById и подобных функций. Они больше не разрешены в контексте пользовательских функций.

см.https://code.google.com/p/google-apps-script-issues/issues/detail?id=5174 для получения более подробной информации.

Они предлагают использовать IMPORTRANGE в качестве обходного пути, но, как упоминалось ранее, это нужно вызывать в ячейке.

нашим решением было использовать IMPORTRANGE в лист и передать полученные данные в нашу пользовательскую функцию, так как набор данных был небольшим. Надеюсь, эта информация поможет!


мне нужно было сделать это недавно. Это то, что я придумал, просто жестко кодируя ключ электронной таблицы и диапазон в 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 , "") // 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