我有一张Google表格。它有一个与之关联的自定义脚本(读取:函数集)。我想分享这个工作表模板(即工具),而不是与同事共享(即通过电子邮件地址添加它们,就像传统的Google驱动器共享一样),而是与任何希望自己复制的人自己使用它(即,不是我的副本,他们自己的副本)。理想情况下,我会在GitHub(或类似的)上回购这个项目/工具,并让他们抓住它。
我可以“下载为...”表单,但脚本不会保持“附加”状态。这些脚本现在是Google认为的附加组件吗?如果是这样,我如何将工作表+脚本保持为“整体”。
此外,作为一种临时解决方法,我尝试将脚本从我的工作副本复制/粘贴到工作表的另一个副本(通过“下载”创建,然后在差异Google帐户下再次打开)。但是,这也没有按计划进行。我的脚本中有一个功能,用于检查表单是否在第一个选项卡/表格上(即getActiveSheet()。getSheetId()== 0)。这适用于我的开发/工作副本。但是,一旦我复制/粘贴SheetId,就会返回7或8位#。有没有办法保持SheetId相对于工作表,而不是所有工作表(或任何Id代表。)
注意:我绝不是Google表格专家。这只是我自己的一个侧面项目,我最终建立到了想要与他人分享的地步。请假设我知道甚至比你想象的还要少。谢谢:))
答案 0 :(得分:1)
要解决查找第一个标签/表格的问题,请使用sheet index代替工作表ID。因此,而不是getActiveSheet().getSheetId() == 0
,而不是getActiveSheet().getIndex() == 0
。
至于下载脚本 - 看起来你已经创建了一个容器绑定脚本。您可以创建两种类型的脚本,独立脚本和容器绑定脚本。 (参见Google的解释here)。通过直接转到script.google.com创建独立脚本,但我点击了工具 - >脚本编辑器,我猜测(请纠正我,如果我认为错了),以便脚本被锁定到那个特定的电子表格。没关系,但是a)这意味着你不能像我最初建议的那样通过Google云端硬盘单独下载,b)当你下载工作表时,它会将其作为Excel工作表下载(它不支持Google App脚本,因此脚本当然不附带它。)
以下是我对您的用例的建议:
如果有帮助,请告诉我!
答案 1 :(得分:1)
我不明白为什么要使用外部服务来制作电子表格的副本。由于Google Scripts仅在Google电子表格中运行,因此我没有看到任何有用的用例......但这不是重点,您可以按照自己的意愿行事。
也就是说,最简单的(也可能是唯一的)是与某人共享文档并创建一个onOpen函数,建议创建它的副本。这个脚本应该在所需的授权之后执行,副本将是他们自己的副本,不再有任何链接到你的G帐户(如果我理解你的话,这是目标)。 比我无法想象的更简单直接。
为了避免它们的副本保持相同的onOpen行为,只需设置一个存储在userProperties中的变量,这样当存在时,onOpen的这部分就不会执行。
这是我已经使用过的工作流程,效果很好。
我可以建议一个完全不同的工作流程,让其他人获得你的SS的个人副本。
Here is a test,试一试,如果您有兴趣,请告诉我。
EDIT2:,因为另一个答案提供了类似的工作流程,我决定展示我在此答案中使用的代码,以使该过程更加用户友好。
我使用2个webApps:
下面的代码(当然是2个不同的项目):
// APP 1 :
function doGet(){
var app = UiApp.createApplication().setTitle('Demo-App');
var link = app.createAnchor('Click this link to create your own copy <br>of my spreadsheet.<br>You will be asked for authorizations<br>tocreate a spreadsheet in your drive',true,'https://script.google.com/macros/s/AKfycbwQ5s_WWrsWXx_umZ1v91XGnm3RaO2Z7UQSXNiWFiaTwGuXIXqq/exec');
app.add(app.createVerticalPanel().setStyleAttribute('padding','50px').add(link));
return app;
}
// APP 2
function doGet(){
var ss = SpreadsheetApp.openById('0AnqSFd3iikE3dGNEUDdoLWhUZl9sZ3Z2Zm5XbjZzTkE');
var copy = ss.copy(ss.getName()); / the SS is shared to "anyone with the link can view"
var app = UiApp.createApplication().setTitle('SSCreate');
var panel = app.createVerticalPanel().setStyleAttribute('padding','50px');
panel.add(app.createHTML('A new spreadsheet has been created in your drive with name '+ss.getName()));
panel.add(app.createAnchor('Open it from <b>here</b>',true,copy.getUrl()));
panel.add(app.createAnchor('or from your own Drive','https://drive.google.com/?authuser=0#all'));
return app.add(panel);
}