我有两个不同的电子表格,它们都有自己的脚本项目。我从SpreadsheetA创建了一个库,并将其链接到SpreadsheetB。现在,当我从SpreadsheetB脚本调用SpreadsheetA的函数时,它要在SpreadsheetB的当前活动表中运行,而我想在SpreadsheetA的选定表上运行该函数。
function createDO() {
var ss = SpreadsheetApp.getActive(); //SpreadsheetB
var cell = ss.getActiveCell().getRowIndex();
var spreadSheetAURL = "URL"; //SpreadsheetA
var spreadSheetsInA = SpreadsheetApp.openByUrl(spreadSheetAURL).getSheetByName("name");
spreadSheetsInA.activate()
Sheetname.Project(); //script in SpreadsheetA
};
我需要从当前SpreadsheetB运行SpreadsheetA的Sheetname.Protect()
函数。
答案 0 :(得分:2)
首先,值得注意的是,库不能像这样工作。正如Oleg Valter所言,库本质上是实用程序脚本,没有绑定到任何一个特定的脚本/类/项目。
但是,作为一种解决方法,您可以设置一个Web应用程序,该程序可以从一个项目调用到另一个项目,并在相应电子表格的doGet()
函数内运行代码。
结构看起来像这样:
在电子表格A中:
function doGet(e) {
var sheetName = e.parameter.sheetName
var sheet = SpreadsheetApp.getActiveSpreadheet.getSheetByName(sheetName);
sheet.activate();
// I am not how this works, but I have extrapolated from your question
Sheetname.Project();
}
然后从Publish > Deploy as web app...
菜单项将其部署为Web应用程序。设置应为Execute the app as: me
和Who has access to the app: Anyone (even anonymous)
。
然后,从对话框的电子表格B:
中获取Web应用程序URL。function createDO() {
var ss = SpreadsheetApp.getActive(); //SpreadsheetB
var cell = ss.getActiveCell().getRowIndex();
var webAppUrl = "URL"; //SpreadsheetA
UrlFetchApp.fetch(webAppUrl + "?sheetName=name");
};
?sheetName=name
参数是一个URL查询字符串,将被传递到Web应用程序的doGet(e)
的事件对象。这是通过e.parameter.sheetName
访问的。
查询字符串=
右侧的字符串必须是您最初尝试激活的工作表名称。
我希望这对您有帮助!