如何使用Javascript获取多个选定项的列表并将其值作为数组输出

如何使用Javascript获取多个选定项的列表并将其值作为数组输出,javascript,google-apps-script,web-applications,Javascript,Google Apps Script,Web Applications,我在自学如何编码。我的第一个项目是使用Apps脚本的webApp。除了一件事之外,我已经设法自己完成了大部分工作。。。我似乎无法将多个选择框中的项目输出到逗号分隔的值数组中 目前,我已设法在仅选择一个列表项时返回单个值。参考: 但如果我选择了不止一个,什么都不会发生。参考: 基本上,我想实现的是: 如果。。。比尔和玛丽]。。。从列表中选择,其相应的年龄输出为。。。{33,44}. 或者如果。。。[比尔、玛丽和乔]…被选中,结果是{33,44,21} 数据来自一张包含两列“Staff”和“Ages

我在自学如何编码。我的第一个项目是使用Apps脚本的webApp。除了一件事之外,我已经设法自己完成了大部分工作。。。我似乎无法将多个选择框中的项目输出到逗号分隔的值数组中

目前,我已设法在仅选择一个列表项时返回单个值。参考:

但如果我选择了不止一个,什么都不会发生。参考:

基本上,我想实现的是:

如果。。。比尔和玛丽]。。。从列表中选择,其相应的年龄输出为。。。{33,44}. 或者如果。。。[比尔、玛丽和乔]…被选中,结果是{33,44,21}

数据来自一张包含两列“Staff”和“Ages”的单页。列表也是动态无限的

万一我的要求令人困惑,我会清楚地说明我想要达到的目标,但我似乎无法破解它

希望这个先进的社区能帮助我解决这个挑战

现在,这里有Code.gs和Javascript供参考

注意:我正在寻找一个Javascript解决方案。另外,请原谅我对这篇处女文章的格式设置

代码.gs

HTML

问题: HTMLSelectElement.value仅返回第一个选定的值。 解决方案: 使用HTMLSelectElement.selectedOptions获取所有选定的HTMLOptionElement值 第1段: 然后,您应该修改您的。或者,您应该将整个数据作为2D数组传递给客户端,使用Map获取年龄:

第2段: 服务器端:

客户端:

参考资料:
你也可以发布你的HTML代码吗?嘿@Addis,我已经按照要求添加了HTML代码。嗨@cooper,我在搜索中遇到了这个问题。我向你们保证,你们可能会发现更多看起来是重复的。事实上,当我以非会员身份浏览这个论坛时,我至少保存了8篇帖子。加入论坛并寻求帮助是我绝对的第二次到最后的手段。最后一个选择是付钱给某人,让他们花时间教我一些东西,这对于这个社区的大多数高级成员来说可能是一个简单的解决方案。但如果我到了那里,我会过桥的。你的doGet函数?谢谢你的回答。首先,我在问题中加入了doGet函数。其次,我使用备选代码段2实现了您的响应。然而,它似乎没有返回{ages}。输出看起来像。“我肯定我错过了什么。”汉斯说​非常感谢@TheMaster。现在一切都很好!
function doGet(e){
  var ss = SpreadsheetApp.openById(ssID);
  var ws = ss.getSheetByName("Values");
  var posts = ws.getRange(1,1,ws.getRange("A1").getDataRegion().getLastRow(),1).getValues();
  var postListArray = posts.map(function(r){ return '<option>' + r[0] + '</option>'; }).join('');
  var tmp = HtmlService.createTemplateFromFile("page");
    tmp.posts = postListArray;
      return tmp.evaluate();
}

function getAges(uStaff){
  var ss = SpreadsheetApp.openById(ssID);
  var ws = ss.getSheetByName("Values");
  var data = ws.getRange(1, 1, ws.getLastRow(), 2).getValues();
  var staffList = data.map(function(r){ return r[0]; });
  var agesList = data.map(function(r){ return r[1]; }); 
  var position = staffList.indexOf(uStaff);  
      if(position > -1){
          return agesList[position];
        } else {
          return 'Invalid';
      }  
}
document.getElementById("staff").addEventListener("change",getRecs);

function getRecs(){
  var uStaff = document.getElementById("staff").value;
    google.script.run.withSuccessHandler(updateAges).getAges(uStaff);    
}

function updateAges(ages){
  document.getElementById("age").value = ages;  
}
<div class="row">
    <div class="input-field col s6">
      <select id="staff" multiple>
        <?!= posts; ?>
      </select>
      <label for="staff" style="font-size: 20px;">Staff</label>
    </div>
    <div class="input-field col s6">
      <input type="text" id="age" class="validate" disabled>
    </div>
</div>
var uStaff = [...(document.getElementById("staff").selectedOptions)]
                        .map(e=>e.value);//uStaff is a array of staffs. eg ['Bill', 'Mary']
function getData(){
  var ss = SpreadsheetApp.openById(ssID);
  var ws = ss.getSheetByName("Values");
  var data = ws.getRange(1, 1, ws.getLastRow(), 2).getValues();
  return data;
}
document.getElementById("staff").addEventListener("change",getRecs);
var map = null;
function getRecs(){
  if(!map) {//call server if data is not retrieved previously
    google.script.run.withSuccessHandler(updateAges).getData()
  } else {updateAges()};    
}
function updateAges(arr){
  if(!map) map = new Map(arr);//map of [[staffs,ages]]
  let uStaff = document.getElementById("staff").selectedOptions;
  let ages = [...uStaff].map(staff=>map.get(staff.value)).join();
  document.getElementById("age").value = ages;  
}