微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 Google 表格中的一系列值设置为 <datalist> 代码.gsindex.html代码.gsindex.html参考资料

如何解决如何将 Google 表格中的一系列值设置为 <datalist> 代码.gsindex.html代码.gsindex.html参考资料

我有一些 Google Sheet,里面有一个可编辑的职位列表('Items'!A1:A)。我还有另一个表,它使用该方法从在 Google Web Apps 中创建的页面写入数据。我需要它来包含第一个工作表范围内的值。

在其中一个主题中,我发现了以下脚本:

<script>
  var datalist = document.getElementById('wrkList');
  var fragment = document.createDocumentFragment();

  var myList = ['Item1','Item2','Item3'];

  // Prepare the option elements to be rendered.
  myList.forEach(function(wrk) {
    var option = document.createElement('option');
    var text = document.createTextNode(wrk);

    option.value = wrk;
    option.appendChild(text);
    fragment.appendChild(option);
  });

  // Append all of them to DOM.
  datalist.appendChild(fragment);
</script>

如何将第一个 Google Sheets ('Items'!A1:A) 范围内的值传递给 myList 变量?

UPD。我将尝试更详细地解释我需要什么。

Web Apps 页面一个输入字段:

<input type="text" list="wrkList" />
  <datalist id="wrkList"></datalist>

和 .gs 中的函数

function itemsList() {
  var sheet = SpreadsheetApp.openById('1WeO8SyHj259jashQKXZ0WT_saSZHgk31yAQ1kZqiWpc').getSheetByName("Items");
  var lastrow = sheet.getLastRow();
  var myList = sheet.getRange(1,1,lastrow).getValues();
  return myList;
}

我需要将 itemsList() 函数获得的值作为值传递给 datalist

解决方法

与 Apps 脚本的“服务器客户端”或“客户端服务器”通信示例

这是一个最小的例子,展示了如何将您的数据作为数组输入到前端。

代码.gs

function doGet(){
  return HtmlService.createHtmlOutputFromFile("index")
}

function getInfo() {
  let file = SpreadsheetApp.getActive();
  let sheet = file.getSheetByName("Items");
  let range = sheet.getRange("A1:A");
  let values = range.getValues();

  return JSON.stringify(values);
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>

    <h1>Hello</h1>
    <button id=main>Run</button>

<script>   
function main(){
  google.script.run.withSuccessHandler(handleInfo).getInfo()
}

function handleInfo(info){
  console.log(JSON.parse(info))
}

const mainButton = document.getElementById("main")
mainButton.addEventListener('click',() => main())
</script>

  </body>
</html>

如果你运行这个,那么你应该将范围记录到控制台。

您可能不需要 JSON.stringify JSON.parse - 如果您的数据只是数字和字符串。如果它是约会之类的东西,那么您将需要它。

到目前为止您的代码

您似乎正在尝试从纯 JavaScript 上下文中调用 Apps 脚本特定的内容。像 SpreadsheetApp 这样的东西在 JavaScript 中不存在,只在 Apps Script 中存在。因此,您的网络应用程序中的 <script> 标记不能包含任何直接引用电子表格的内容。您需要使用

的构造
google.script.run.withSuccessHandler(handleInfo).itemsList()

这将向 Apps 脚本发送请求,以在 itemsList() 文件中运行 .gs。该函数返回的任何内容都将用作本地 handleInfo 函数的参数。即当 Apps Script 函数成功时,它会这样做:

handleInfo([with whatever itemsList returns])

理想情况下,您让 itemsList 返回一个简单的字符串数组,以便您可以轻松创建 <option> 元素以插入到您的数据列表中。

工作示例

我不知道你的数据是什么样的,所以我自己发明了一些:

enter image description here

我也不知道您的脚本的其余部分是什么样子,也不知道您的 html 文件的名称,所以我尽可能多地填补了空白。

我还必须使用自己的电子表格 ID 进行测试,但在下面的示例中,我使用了您提供的电子表格 ID。

代码.gs

function doGet(){
  return HtmlService.createHtmlOutputFromFile("index")
}

function itemsList() {
  var sheet = SpreadsheetApp.openById('1WeO8SyHj259jashQKXZ0WT_saSZHgk31yAQ1kZqiWpc').getSheetByName("Items");
  var lastrow = sheet.getLastRow();
  var myList = sheet.getRange(1,1,lastrow).getValues();
  // This line is to transform the array from [[1],[2],[3]] to [1,2,3]
  myList = myList.map(item => item[0])
  return JSON.stringify(myList); // JSON.stringify may not be neccesary
}

index.html

<!DOCTYPE html>
<html>
<body>
  <input type="text" list="wrkList"/>
  <datalist id="wrkList"></datalist>
</body>

<script>
function handleInfo(info){
  const list = JSON.parse(info) // JSON.parse needed if you used JSON.stringify in Code.gs
  
  // select datalist element
  const datalist = document.getElementById('wrkList')

  // forEach loop to create and append an option element for each item in list
  list.forEach(item => {
    const option = document.createElement('option')
    option.setAttribute('value',item)
    datalist.appendChild(option)
  })
}

// execute the itemsList function in code.gs and with the response
// execute the handleInfo function.
google.script.run.withSuccessHandler(handleInfo).itemsList()
</script>

</html>

一旦被删除,这将加载一个带有以下内容的 HTML 页面:

enter image description here

参考资料

,

我更改了代码:

<script>
  var sheet = SpreadsheetApp.openById('1WeO8SyHj259jashQKXZ0WT_saSZHgk31yAQ1kZqiWpc').getSheetByName("Items");
  var lastrow = sheet.getLastRow();
  
  var datalist = document.getElementById('wrkList');
  var fragment = document.createDocumentFragment();

  var myList = sheet.getRange(1,lastrow).getValues();

  // Prepare the option elements to be rendered.
  myList.forEach(function(wrk) {
    var option = document.createElement('option');
    var text = document.createTextNode(wrk);

    option.value = wrk;
    option.appendChild(text);
    fragment.appendChild(option);
  });

  // Append all of them to DOM.
  datalist.appendChild(fragment);
</script>

但在控制台中出现此错误:

未捕获的 ReferenceError:SpreadsheetApp 未定义 在 userCodeAppPanel:2

,

您可以尝试使用 SpreadsheetApp.openById()

您可以找到 SpreadsheetApp here 的文档。

请参阅下面的改编代码:

  var datalist = document.getElementById('wrkList');
  var fragment = document.createDocumentFragment();

  var myList = SpreadsheetApp.openById('THE_ID_OF_YOUR_SPREADSHEET').getSheetByName('THE_SHEET_NAME').getRange('THE_RANGE').getValue();

  // Prepare the option elements to be rendered.
  myList.forEach(function(wrk) {
    var option = document.createElement('option');
    var text = document.createTextNode(wrk);

    option.value = wrk;
    option.appendChild(text);
    fragment.appendChild(option);
  });

  // Append all of them to DOM.
  datalist.appendChild(fragment);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?