7

我今天一直在玩 Google Apps Script,我正在尝试编写一些自定义电子表格函数。我进行了一些搜索,但找不到我的查询的答案。

我知道在 Google 电子表格上,您可以在电子表格的单元格中使用 ImportRange,如下所示:

=ImportRange(spreadsheet_key;sheet!range_of_cells)

我的问题是是否可以在 Google Apps 脚本中执行类似的操作,如果可以,如何操作?

我想从另一个电子表格上的工作表中导入一系列单元格(而不是脚本所在的电子表格上的工作表)。

4

3 回答 3

5

是的,这是完全可能的。您只需要调用SpreadsheetApp.openById然后正常获取所需的工作表和范围。

请查看文档range.getValues()并且range.setValues()是非常基本的 GAS 方法,并且描述得很好。

阅读教程

于 2012-06-21T18:07:17.457 回答
3

Google 似乎以其无限的智慧改变了 openById 和类似函数的行为。在自定义函数的上下文中不再允许使用它们。

有关更多详细信息,请参阅https://code.google.com/p/google-apps-script-issues/issues/detail?id=5174

他们建议使用 IMPORTRANGE 作为解决方法,但如前所述,这需要在单元格内调用。

我们的解决方案是在工作表中使用 IMPORTRANGE,并将获取的数据传递到我们的自定义函数中,因为数据集很小。我希望这个信息帮助!

于 2015-07-01T21:23:55.153 回答
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和 VMERGE 与一些 SQL 将私人工作表中的选择组合到中间工作表中,然后是一个公共工作表,它只有一个单元格包含= myScriptedImportRange( GoogleClock() )

请注意,这里有类似的方法:https ://stackoverflow.com/a/11857014

另请注意,ImportRange当源工作簿打开/未打开时,该功能和相关功能通常会出现不显示导入数据的问题。此处的评论中描述了一种简单的解决方法:https ://stackoverflow.com/a/11786797

于 2013-01-28T08:34:05.183 回答