通过Github发布/共享Google表格

时间:2014-06-30 16:28:05

标签: google-apps-script google-docs

我有一张Google表格。它有一个与之关联的自定义脚本(读取:函数集)。我想分享这个工作表模板(即工具),而不是与同事共享(即通过电子邮件地址添加它们,就像传统的Google驱动器共享一样),而是与任何希望自己复制的人自己使用它(即,不是我的副本,他们自己的副本)。理想情况下,我会在GitHub(或类似的)上回购这个项目/工具,并让他们抓住它。

我可以“下载为...”表单,但脚本不会保持“附加”状态。这些脚本现在是Google认为的附加组件吗?如果是这样,我如何将工作表+脚本保持为“整体”。

此外,作为一种临时解决方法,我尝试将脚本从我的工作副本复制/粘贴到工作表的另一个副本(通过“下载”创建,然后在差异Google帐户下再次打开)。但是,这也没有按计划进行。我的脚本中有一个功能,用于检查表单是否在第一个选项卡/表格上(即getActiveSheet()。getSheetId()== 0)。这适用于我的开发/工作副本。但是,一旦我复制/粘贴SheetId,就会返回7或8位#。有没有办法保持SheetId相对于工作表,而不是所有工作表(或任何Id代表。)

注意:我绝不是Google表格专家。这只是我自己的一个侧面项目,我最终建立到了想要与他人分享的地步。请假设我知道甚至比你想象的还要少。谢谢:))

2 个答案:

答案 0 :(得分:1)

要解决查找第一个标签/表格的问题,请使用sheet index代替工作表ID。因此,而不是getActiveSheet().getSheetId() == 0,而不是getActiveSheet().getIndex() == 0

至于下载脚本 - 看起来你已经创建了一个容器绑定脚本。您可以创建两种类型的脚本,独立脚本和容器绑定脚本。 (参见Google的解释here)。通过直接转到script.google.com创建独立脚本,但我点击了工具 - >脚本编辑器,我猜测(请纠正我,如果我认为错了),以便脚本被锁定到那个特定的电子表格。没关系,但是a)这意味着你不能像我最初建议的那样通过Google云端硬盘单独下载,b)当你下载工作表时,它会将其作为Excel工作表下载(它不支持Google App脚本,因此脚本当然不附带它。)

以下是我对您的用例的建议:

  • 不是下载电子表格,而是通过转到文件 - >制作一个名为yourspreadsheet_public的新副本或其他内容。复制一份。 (如果您只想将个人电子表格提供给全世界,则可以跳过此步骤。)
  • 点击分享 - >将副本提供给任何人查看。改变 - >任何拥有链接(或网络公开)的人 - >选择"可以查看"来自下拉菜单 - >保存。
  • 现在,您可以将链接分发给任何想要它的人。有权访问该文件的任何人都可以像在第一步中使用他们自己的Google云端硬盘一样制作副本,在那里他们可以编辑自己的私人副本,包括您的脚本。

如果有帮助,请告诉我!

答案 1 :(得分:1)

我不明白为什么要使用外部服务来制作电子表格的副本。由于Google Scripts仅在Google电子表格中运行,因此我没有看到任何有用的用例......但这不是重点,您可以按照自己的意愿行事。

也就是说,最简单的(也可能是唯一的)是与某人共享文档并创建一个onOpen函数,建议创建它的副本。这个脚本应该在所需的授权之后执行,副本将是他们自己的副本,不再有任何链接到你的G帐户(如果我理解你的话,这是目标)。 比我无法想象的更简单直接。

为了避免它们的副本保持相同的onOpen行为,只需设置一个存储在userProperties中的变量,这样当存在时,onOpen的这部分就不会执行。

这是我已经使用过的工作流程,效果很好。


编辑:

我可以建议一个完全不同的工作流程,让其他人获得你的SS的个人副本。

Here is a test,试一试,如果您有兴趣,请告诉我。


EDIT2:,因为另一个答案提供了类似的工作流程,我决定展示我在此答案中使用的代码,以使该过程更加用户友好。

我使用2个webApps:

  • 一个以“我”运行,可以访问我的驱动器并在未经授权的情况下为其用户运行,除了显示警告和链接之外别无其他任何操作。(任何人都可以访问匿名)
  • 第二个创建副本并需要授权以允许在用户自己的驱动器中创建SScopy +几个链接。(以用户访问应用程序的方式运行

下面的代码(当然是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);
}