谷歌应用脚本为什么会将我的数组转换成字符串?

3
我很简单地调用了我的code.gs文件,来获取一些表中的数据。我从html文件中调用此函数以填充下拉列表。所以:

Code.gs

function getTheStuffINeed() {

  // Get data from sheet
  var ss =  SpreadsheetApp.openById("ss_id");
  var sheet = ss.getSheetByName("sheetname");
  var myStuff = sheet.getRange(2, 1, sheet.getLastRow()-1, 3).getValues();

  Logger.log(Array.isArray(myStuff));  // true. 
  Logger.log(myStuff); // [[id1, aVal, aSecondVal], [id2, AnotherVal, anotherSecondVal]] 

  return myStuff ; // An array of arrays
}

index.html

<script>
  // get data
  var myStuff= <?= getTheStuffINeed() ?>;  

  console.log(Array.isArray(myStuff)); // false
  console.log(myStuff); // id1, aVal, aSecondVal, id2, AnotherVal, anotherSecondVal, etc
</script>

当我的结果出现在HTML页面上时,它不再是一个数组的数组,而是一个由逗号分隔的值组成的单个字符串。
请问有人能解释这里发生了什么,以及如何修复吗?谢谢。
2个回答

2

这里有一个解决方法
在客户端需要编写:

var myStuff= JSON.parse(<?= getTheStuffINeed() ?>); 

在服务器上:

  return JSON.stringify(myStuff) ; // An array of arrays

1
当使用HTML Service: Templated HTML时,你编写的代码不会直接执行,服务器会评估模板并返回一个HtmlOutput对象,脚本可以向用户提供该对象。 打印脚本使用上下文转义执行代码并将新内容附加到HtmlOutput中,以避免意外允许跨站点脚本(XSS)漏洞,因此结果是安全的字符串,没有标记可以导致意外的代码执行。 你可以:
  • 使用 JSON.stringify() 方法将数组转换为 JSON 字符串,然后使用 JSON.parse() 方法 将字符串解析为 JSON,如 Harold 所述。

  • 异步填充选择器:

index.html

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
// The code in this function runs when the page is loaded.
$(function() {
  google.script.run.withSuccessHandler(populateStuff)
      .getTheStuffINeed();
});

function populateStuff(stuff) {
  var options = '';
  for (var i = 0; i < stuff.length; i++){
    options += '<option id="'+stuff[i][0]+'" value="'+ stuff[i][1] + '">' + stuff[i][2] + '</option>';
  }
  $('#select').append(options);
}
</script>
  • 在模板中创建并填充选择器(不要遵循最佳实践)。

index.html

<select>
  <?
  var myStuff= getTheStuffINeed(); 
    for (var i = 0; i < myStuff.length; i++) { ?>
      <option id="<?= myStuff[i][0] ?>" value="<?= myStuff[i][1] ?>"><?= myStuff[i][2] ?></option>
  <? } ?>
</select>

太棒了。异步触摸对于我还有其他任务也将非常完美地发挥作用。感谢您详细的解释。 - spryce
很高兴能帮忙 (: 想要了解有关异步客户端JavaScript API的更多信息,请查看官方文档 - ocordova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接