Google apps script 谷歌应用程序脚本&;工作表-我必须以完整的读/写方式共享吗?

Google apps script 谷歌应用程序脚本&;工作表-我必须以完整的读/写方式共享吗?,google-apps-script,google-sheets-api,Google Apps Script,Google Sheets Api,我有一个可以访问电子表格的应用程序脚本(如果你想玩的话)。对于大多数东西,它所做的只是阅读表格 然而 我想让用户存储一些数据。基本上,我让脚本提取他们的电子邮件地址,并用它在我的电子表格中创建一个页面 当然,不幸的是,这样做需要为他们提供对工作表的读/写访问权限。。。为了保护用户的数据,我宁愿不这样做 但是,是否有可能同时: 将(工作表的)读/写访问权限扩展到我的应用程序本身,而不公开工作表,以及 仍然可以访问用户的电子邮件地址吗 我在这个过程中学到的东西: 如果我部署应用程序以自己的身份运行

我有一个可以访问电子表格的应用程序脚本(如果你想玩的话)。对于大多数东西,它所做的只是阅读表格

然而

我想让用户存储一些数据。基本上,我让脚本提取他们的电子邮件地址,并用它在我的电子表格中创建一个页面

当然,不幸的是,这样做需要为他们提供对工作表的读/写访问权限。。。为了保护用户的数据,我宁愿不这样做

但是,是否有可能同时:

  • 将(工作表的)读/写访问权限扩展到我的应用程序本身,而不公开工作表,以及
  • 仍然可以访问用户的电子邮件地址吗
  • 我在这个过程中学到的东西:

    • 如果我部署应用程序以自己的身份运行,则无法访问用户的电子邮件地址
    • API密钥仅对公共数据有用
    我在doGet例程中初始化页面。我将获取用户名和相关表单打包在一个函数中,以便在测试时可以轻松地将占位符替换为电子邮件地址。以下代码对我来说很好,因为我是经过身份验证的用户:

    function doGet(e) {
      if (!e.parameter.page) {
        var userCrewSheetName = getUserSheetName();
        var userCrewSheet = activeSpreadsheet.getSheetByName(userCrewSheetName);
        initializeSheet(userCrewSheet,userCrewSheetName);
        var userBonusSheetName = getUserSheetName("bonus");
        var userBonusSheet = activeSpreadsheet.getSheetByName(userBonusSheetName);
        initializeSheet(userBonusSheet,userBonusSheetName);
        return HtmlService.createTemplateFromFile('test').evaluate();
      }
      return HtmlService.createTemplateFromFile(e.parameter['page']).evaluate();
    }
    
    function initializeSheet(sheet,sheetName) {
      if(sheet == null) { 
        sheet = activeSpreadsheet.insertSheet();
        sheet.setName(sheetName);
        setHeaders(sheet,sheetName);
      }
    }
    
    function getUserSheetName(sheetType) {
      var userName = Session.getActiveUser().getEmail();
      if (!userName) { return };
      if(sheetType == "bonus") {
        return userName + '_my_bonus';
      } else {
        return userName + '_my_crew';
      }
      return "error";
    }
    

    我去过那里,伙计。如果我正确理解您的问题,您希望您的webapp能够检测用户ID,允许他们从中读取数据,并且在某些情况下允许他们将数据存储到其中


    你的答案是你需要用RunAs:Me再次发布你的webapp。这样,您仍然可以捕获用户ID,允许他们读取数据和写入数据,而无需在访问webApp时直接编辑电子表格。干杯

    我去过那里,伙计。如果我正确理解您的问题,您希望您的webapp能够检测用户ID,允许他们从中读取数据,并且在某些情况下允许他们将数据存储到其中


    你的答案是你需要用RunAs:Me再次发布你的webapp。这样,您仍然可以捕获用户ID,允许他们读取数据和写入数据,而无需在访问webApp时直接编辑电子表格。干杯

    你能在问题本身中显示代码吗?编辑以添加类似于我需要在上对所有API密钥/Oath2身份验证内容进行排序的内容?你能在问题本身中显示代码吗?编辑以添加类似于我需要在Hmmm对所有API密钥/Oath2身份验证内容进行排序的内容。。。在这种情况下,我当前用于捕获它们的方法不应该起作用,因为getActiveUser的文档说,如果我使用run as:it friend,它将返回我的电子邮件地址,而不是他们的电子邮件地址,您会感到惊讶。我有20多个Web应用程序可供建议,其中我已将执行设置为“我”,这样其他人就不能直接在电子表格上进行任何更改,但它仍然捕获他们的电子邮件地址,并允许他们通过Web应用程序界面读取/修改电子表格中的数据。:)悲哀地不,当我执行会话时,它返回“undefined”。getActiveUser().getEmail();我希望看到其中一个示例appsI复制了这个场景,显然我错了。真的很抱歉。我创建的webapps是在一个G-Suite帐户中,所以这可能就是它捕获id的原因(嗯……在这种情况下,我目前用于捕获它们的方法不应该起作用,因为getActiveUser的文档说,如果我使用run as:it friend,它将返回我的电子邮件地址,而不是他们的电子邮件地址,你会感到惊讶。我有20多个Web应用建议我将执行设置为我,这样就没有其他人可以执行e直接在电子表格上进行任何更改,但它仍然捕获他们的电子邮件地址,并允许他们通过webapp界面读取/更正电子表格中的数据。:)遗憾的是。。。不,当我执行会话时,它返回“undefined”。getActiveUser().getEmail();我希望看到其中一个示例appsI复制了这个场景,显然我错了。真的很抱歉。我创建的webapps是在一个G-Suite帐户中,所以这可能就是它捕获id的原因(