我今天一直在玩Google Apps脚本,我正在尝试编写一些自定义电子表格功能。我做了一些搜索但找不到我的查询的答案。
我知道在Google电子表格中,您可以在电子表格的单元格中使用ImportRange,如下所示:
=ImportRange(spreadsheet_key;sheet!range_of_cells)
我的问题是,是否可以在Google Apps脚本中执行类似操作,如果是,可以如何做?
我想从另一个电子表格中的工作表中导入一系列单元格(而不是脚本所在的电子表格中的工作表)。
答案 0 :(得分:5)
是的,这是完全可能的。您只需要调用SpreadsheetApp.openById
,然后正常获得所需的工作表和范围。
请查看documentation:range.getValues()
和range.setValues()
是非常基本的GAS方法,并且描述得非常好。
同时阅读the tutorial。
答案 1 :(得分:2)
似乎谷歌以其无限的智慧改变了openById和类似功能的行为。在自定义函数的上下文中不再允许它们。
有关详细信息,请参阅https://code.google.com/p/google-apps-script-issues/issues/detail?id=5174。
他们建议使用IMPORTRANGE作为解决方法,但如前所述,这需要在单元格中调用。
我们的解决方案是在工作表中使用IMPORTRANGE,并将获取的数据传递到我们的自定义函数中,因为数据集很小。我希望这些信息有所帮助!
答案 2 :(得分:1)
我最近需要这样做。这就是我提出的,只需将电子表格密钥和范围硬编码到ahab的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
的中间工作表和一些带有一些SQL的VMERGE将私有工作表中的选择组合到中间工作表中,然后是一个简单的公共工作表有一个单元格包含= myScriptedImportRange( GoogleClock() )
请注意,这里有类似的方法:https://stackoverflow.com/a/11857014
另请注意,ImportRange
函数和相关函数通常会在原始工作簿未打开时出现无法显示导入数据的问题。这里有一个简单的方法:https://stackoverflow.com/a/11786797