如何使用GAS中的Properties服务正确存储全局值?

时间:2014-06-27 15:40:59

标签: google-apps-script global-variables

我使用Google应用脚本遇到此问题。 我在电子表格中有一个菜单,有两个选项(设置密码和添加时间记录)。这些选项引发UI服务用户界面以分别提示其数据。要访问添加时间记录,我先询问用户是否经过身份验证。我使用scriptProperties = PropertiesService.getScriptProperties()和setProperty('authenticated',false)来保存经过身份验证的初始值。

1-我点击设置密码,我登录确定并关闭用户界面。

2-我点击添加时间记录,我希望收到我的AddTime记录Ui(因为我先设置密码),而是收到Set Password UI。即使我再次登录,我也会一次又一次地收到相同的UI。

每次单击菜单选项时,无论我之前执行的操作如何,都会将身份验证重置为false。这是预期的行为?或者我做错了什么?非常感谢你的帮助。

var scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('authenticated', 'false');
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('ProWorkflow')
    .addItem('Set Pasword', 'getPassword').addSeparator()
    .addItem('Add Time Record', 'isAuthenticated').addSeparator()
    .addToUi();
}
function isAuthenticated()
{
  var scriptProperties = PropertiesService.getScriptProperties();
  var value = scriptProperties.getProperty('authenticated');
  if(value =='false'){
    getPassword(); // at the end of this function I set scriptProperties.setProperty('authenticated', ‘true’);
  }
  return addTimeRecord();
}
function getPassword(e)
{
    …
    …
    …
   var scriptProperties = PropertiesService.getScriptProperties();
   var value = scriptProperties.getProperty('authenticated');
   value = 'true';  
   scriptProperties.setProperty('authenticated', value); //change de value of uthenticated 
   return app.close(); 
}

2 个答案:

答案 0 :(得分:1)

我不清楚哪里如果你想以编程方式设置项目属性。我在我的脚本中添加了一个函数:

function setScriptProperties() {
    var scriptProperties = PropertiesService.getScriptProperties();
    scriptProperties.setProperty('KEY', 'Some value.');
}

然后我使用UI来手动运行此功能'来自GAS界面。

enter image description here

从UI调用一次函数后,将设置项目属性。

答案 1 :(得分:0)

"每次点击菜单选项时,无论我之前采取的操作是什么,都会将身份验证重置为false"

实际上就是这样。

当您将线放在任何函数之外时,它会在每次运行任何函数时执行,因此您的线scriptProperties.setProperty('authenticated', 'false');每次都会将其设置为false。

将其移动到应有的位置,scriptPropertiesuserProperties - 根据定义 - 作为全局变量工作,因为它们存储在全局脚本/用户范围内,实际上它们是什么是专为..

另请参阅您在getPassword函数中编写的内容...您在上面显示的内容不是很合理(请参阅代码中的注释):

   var value = scriptProperties.getProperty('authenticated');// you get a value
   value = 'true';  // and change it immediately to a constant... what's the point ?
   scriptProperties.setProperty('authenticated', value); //change de value of uthenticated