将项目传递到html模板

时间:2016-12-09 22:53:27

标签: google-apps-script

我有一个我作为网络应用发布的脚本。我想通过网络应用网址将参数传递给脚本,例如https://script.google.com/a/...JS0AsIOipm/exec?year=2016&festival=Canada 并最终将它们传递到客户端脚本,使用它们来设置默认的表单字段值。

我尝试过一些事情,而我能得到的最远的是:在Code.gs中,我全局定义一个变量,将其设置为传递的参数

//Define this here globally so it is accessed in the HTML Template
var passedParameter;
/**-----------------------------------------------------------------------------------
|
|    Begin section for app interface
|
------------------------------------------------------------------------------------*/
// Script-as-app template.
function doGet(passed) {

  if(passed.parameter.festival && passed.parameter.year){
    passedParameter = passed.parameter;
  }

  var result=HtmlService.createTemplateFromFile('GridView').evaluate()
      .setWidth(1285);

  return result;
}

//Allow us to include other files in the HTML
function include(filename) {

return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}

GridView.html包含:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  </head>

  <script>
    var passedData = "<?!= passedParameter ?>"; //Stores the data directly in the javascript code
  </script>

  <body>

  <p>passed=<?!= passedParameter.year ?></p>
  </body>

    <?!= include('GridView_JS'); ?>

</html>

哪个显示passParameter.year的值

所以它包括GridView_JS.html。这是我想要使用过去的一年和节日的价值观的地方。该文件具有以下功能:

<script>
function showMenuYear(menuItems) {
  var list = $('#optionListYear');

    var desiredValue = passedData.festival + ' ' + passedData.year;
      for(var i=0; i<list.options.length; i++) {
        if ( list.options[i].text == desiredValue ) {
            list.selectedIndex = i;
        break;
        }
      }
  }
</script>

但是错误说明未定义传递参数。我该如何使用它们?我知道我正在传递passParameter.year并传递了Parameter.festival,因为它能够在第一个HTML文件中显示它们。

那么我需要做些什么才能在我的脚本中使用它们?

1 个答案:

答案 0 :(得分:1)

有许多事情需要发生。

将两个scriptlet添加到&#;; GridView_JS&#39;中的JavaScript代码中。文件:

var desiredValue = <?!= passedParameter.festival ?> + ' ' + <?!= passedParameter.year ?>;

但您还必须确保include()函数使用.evaluate();

HtmlService.createTemplateFromFile(fileName).evaluate();

目前,您的include功能使用:createHtmlOutputFromFile()

需要将其替换为createTemplateFromFile(fileName).evaluate()

那么,会发生什么,include()函数将首先评估&#39; GridView_JS&#39;文件,然后评估GridView.html文件。

还有其他选择。您可以将传入的参数放入临时缓存或属性服务中。缓存是临时的,属性服务是永久性的。然后,当加载HTML时,您可以从onload事件运行JavaScript,并调用服务器以从属性服务缓存中获取值。但是,如果您希望HTML中立即可用的值,那么这样做是没有意义的。根据具体情况了解替代方案是很好的。