Google App脚本-为什么getTemporaryActiveUserKey()为唯一用户返回相同的值

时间:2018-09-09 11:54:36

标签: google-apps-script

我已经使用Google App脚本创建了一个联系人类型表单,并已发布为Web App。

由于我需要确定填写表单的用户是唯一的,因此我使用了getTemporaryActiveUserKey()函数来获取用户唯一的密钥,并将其与其余表单数据一起保存到电子表格中。

但是,现在在许多实例中,脚本为多个不同的用户返回了相同的密钥。我知道这些用户实际上使用不同的浏览器,并且位于完全不同的位置。

我的问题是,这怎么可能?

下面是code.gs中的函数,该函数在提交表单时运行,以检索该值

function postFormDataToSheet(form){
  var responseSheet = SSDoc.getSheetByName("Results");

  var time = new Date()

  var userKey = Session.getTemporaryActiveUserKey();
  var resultRow = [time,form.user_name, form.user_email, form.sheet,userKey]
  responseSheet.appendRow(resultRow);
}

HTML表单中的JavaScript函数,当按下提交按钮时,将调用上述函数

$(function(){
  $('#submitButton').on('click', function(){
    google.script.run.withSuccessHandler(SuccessPage).postFormDataToSheet(this.form);    
  })
})

使用以下设置发布Webapp

Execute the app as: Me (myemailaddress)

Who has access to the app: Anyone, even anonymous

2 个答案:

答案 0 :(得分:1)

经过大量研究并尝试了各种情况,我确定了以下内容:

  • getTemporaryActiveUserKey()函数将返回唯一的 键使任何用户使用Google帐户登录(称为“ ActiveUser
  • 如果用户未登录google帐户(或使用隐身会话),则getTemporaryActiveUserKey()仍会返回键值,但该值并非该用户唯一。这是我收到重复密钥的原因。
  • 为确保在发布Web应用程序时仅返回唯一键,应在发布时要求用户登录才能访问它。

基于上述观点,我认为getTemporaryActiveUserKey()函数根本不应该为未登录的用户返回任何值,因为在非唯一用户不可见的情况下,我看不到此类键有任何用处用户。

答案 1 :(得分:-1)

您的Web应用已获得权限"Execute the app as me"的部署,这意味着脚本始终随您执行

摘自Session.getTemporaryActiveUserKey()的文档:

  

获取活动用户唯一的临时密钥,但不显示用户身份。临时密钥每30天旋转一次,并且对于脚本而言是唯一的。

由于它基于活动用户,因此每次都会获得相同的结果,因为对于Google Apps脚本,您是网络应用脚本的唯一活动用户,尽管谁请求该脚本。

如果您希望能够为不同的用户获得不同的值,则需要通过使用Web应用程序权限设置“以用户访问Web应用程序的身份执行应用程序”来确保用户获得授权