【问题标题】:How to share a private spreadsheet on a public site using Awesome Table gadget如何使用 Awesome Table 小工具在公共网站上共享私人电子表格
【发布时间】:2016-01-15 01:49:24
【问题描述】:

我想通过访问私有工作表 url 为公共站点运行 google awesome table 小工具。这是为了保护数据,否则工作表 url 对公众可见,他们可以复制整个工作表。我希望用户只能通过网站获取信息。

我怎样才能做到这一点。有没有办法像我自己一样运行应用脚本之类的小工具。

我是否需要修改小工具 xml 才能访问我的私有工作表(如应用脚本)?

【问题讨论】:

    标签: google-apps-script google-sheets google-gadget


    【解决方案1】:

    您可以在您的私人工作表和公共网站之间使用代理脚本。这不会隐藏工作表 URL,但避免了共享工作表本身的需要。

    在 Awesome Tables 的文档中,请参阅“Use row-level permissions”,其中描述了如何设置代理脚本。然而,这个简单的代理不会控制特定行的显示,而是为您的整个表格提供服务,同时对公众隐藏底层电子表格。

    1. 正常设置您的 Awesome Table 电子表格和小工具。不需要对您的数据进行特殊配置。

    2. 将 Simple Proxy 脚本部署为 Web 应用程序。

      • 将以下脚本复制到您帐户中的新脚本中。
      • 运行一次即可授权。
      • 将其部署为 Web 应用,“像我一样执行”,访问“任何人,包括匿名”。
      • 复制应用程序的公共 URL。

    3. 在 Awesome Table 小工具的“高级参数”选项卡上,将简单代理的公共 URL 粘贴到“Apps 脚本代理 URL”字段中。

    简单代理.gs

    此脚本改编自 Romain 的原始脚本,删除了提供用户级数据过滤的仅限域的功能。

    // Simple proxy for AwesomeTables
    // Adapted from https://script.google.com/d/1UfKnjB6jcemv5-BRP-ckaI5UCoEQI2KuvFdjNzmLpyadelNLCwpvaFsO/edit
    function doGet(e) {
      var ssUrl =  e.parameter.url;
      var sheetName = e.parameter.sheet;
      var a1Notation = e.parameter.range;
      var sheet = SpreadsheetApp.openByUrl(ssUrl).getSheetByName(sheetName); 
      var range = sheet.getRange(a1Notation); 
      var data = range.getValues();
      var dt = {cols:[], rows:[]};
      for(var i = 0; i < data[0].length; i++) {
        dt.cols.push({id:i, label:data[0][i] + ' ' + data[1][i], type: 'string', isNumber:true, isDate:true});
      }
      for(var i = 2; i < data.length; i++) {
          var row = [];
          for(var j = 0; j < data[i].length; j++) {
            if(isNaN(data[i][j])) dt.cols[j].isNumber = false;
            if(data[i][j] instanceof Date == false) dt.cols[j].isDate = false;
            else if(data[i][j].getFullYear() == 1899) {
              dt.cols[j].isDate = false;
              data[i][j] = data[i][j].getHours()+':'+(data[i][j].getMinutes()<10?'0':'')+data[i][j].getMinutes();
            }
            else data[i][j] = "Date("+data[i][j].getTime()+")";
            row.push({v:data[i][j]});
          }
          dt.rows.push({c:row});
      }
      for(var i = 0; i < data[0].length; i++) {
        if(dt.cols[i].isDate) dt.cols[i].type = 'datetime';
        else if(dt.cols[i].isNumber) dt.cols[i].type = 'number';
      }
      var output = e.parameters.callback + '(' + JSON.stringify({
        dataTable: dt
      }) + ')';
      return ContentService.createTextOutput(output).setMimeType(ContentService.MimeType.JAVASCRIPT);
    }
    

    注意事项

    • 用户将能够在托管 Awesome Tables 的页面的 HTML 源代码中查看电子表格的 URL。如果您启用了共享,则电子表格可能对他们开放。

    • 单个简单代理可以为您的帐户有权访问的所有电子表格提供服务。这是您应该注意的功能和风险。

    【讨论】:

    • 嗨,Mogsdad,感谢您的帮助。我试过这个并且正在工作。
    • 嗨,Mogsdad,感谢您的帮助。我试过这个并且正在工作。但是我发现页面加载时间增加了很多(之前的 3 秒,现在是 10 秒)。这似乎是由于遍历脚本中的数据所致。为了加快速度,我们能不能提前做这些动作,把table/json存到一个文件里,在appscript调用的时候读取。我知道在这种情况下,工作表 url 等将被硬编码。但仍然可以加快速度。不知道保存预先构建的表和检索的最佳方法是什么。如果你能指导这将非常有帮助。谢谢哈里
    • 基本思想是合理的。试试看,如果你遇到困难回来问更具体的问题。
    • 我已将json字符串保存到文件中,速度又回来了。但是卡片视图不起作用。它总是显示表格视图。这对于原始代码是正确的,与文件保存无关。可能是什么原因?谢谢你。哈里
    • @user3887453 - 您应该将其作为单独的问题提出,或者作为 Awesome Table 作者的支持问题提出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多