动态弹出下拉表单 Google Apps 脚本

Dynamic Popup Dropdown Form Google Apps Script

我的电子表格的“摘要”选项卡中有一个项目列表,此列表更改相对频繁,但选项的数量限制为 17 个,其中一些有时可能为空。我想将可用选项(非空)放入带有下拉列表的弹出窗口中。然后将该值输入到特定单元格(暂时称为摘要 C55)。

我认为我的 GS 代码是正确的,我在 HTML 组件上迷路了。列表即将出现,没有任何选项。

.GS

function getValuesFromSpreadsheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName("Summary");
  //available characters found in P2:P18 of Summary tab
  var options=[];
  var va=sheet.getRange("P2:P18").getValues();
  for (var i=0;i<va.length;i++){
  options.push(va[i][0]);
  Logger.log(options);
}
  return options; // Retrieve values and send to Javascript
}  

function showDialog() {
  var html = HtmlService.createHtmlOutputFromFile('popup').setWidth(400).setHeight(300);
  SpreadsheetApp.getUi().showModalDialog(html, 'Select your new character');
}
function select(){
   var menu= SpreadsheetApp.getUi().createMenu('Custom Menu');
      menu.addItem('Dropdown Form', 'showDialog');
      menu.addToUi();
}

function onOpen(e){
select();
}

popup.HTML

<!DOCTYPE html>
<script>
    function loadCharacters() {
    google.script.run.withSuccessHandler(makeoptions) 
    .getValuesFromSpreadsheet();
    }
       function makeoptions(ar){
        var charselect = document.createElementById('character');
        console.log(ar);
        for (var i=0;i<ar.length;i++);
        var option = document.createElement("option");
        option.value = ar[i]
        option.id = ar[i];
        charselect.appendChild(option);
  };
  function selected() {
    var value = document.getElementById('character').value;
    document.getElementById("value").innerHTML=value;
    console.log(value);
  };
</script>
<html>
 <head>
  <base target="_top">
</head>
  <body onload="loadCharacters()">
  <form id="Form">
    <div>
       <label for="List"> Select Character </label><br>
        <input list="character" name="charselect">
        <datalist id= "character"></datalist>
        <select id="character" onchange="selected()"> </select><br>
    </div>
    </form>
  </body>
</html>

看起来您正在创建 SELECT 控件,而不是获取 HTML 上已经存在的控件。尝试更改以下行:

var charselect = document.createElementById('character');

收件人:

var charselect = document.getElementById('character');

由于有两个元素具有相同的 ID,您可能应该删除它:

<datalist id= "character"></datalist>

此外,您需要包含每个选项的内部 HTML(在将 child 附加到 SELECT 之前)以显示可用的字符名称:

option.innerHTML = ar[i];


更新:

我意识到For循环里面没有任何东西,所以它也需要改变:

function makeoptions(ar) {
  var charselect = document.getElementById('character');
  console.log(ar);
  for (var i = 0; i < ar.length; i++){
    var option = document.createElement('option');
    option.value = ar[i];
    option.id = ar[i];
    option.innerHTML = ar[i];
    charselect.appendChild(option);
  }
}

除此之外,HTML的其他一些部分也需要更新,例如select函数:

function selected() {
  var value = document.getElementById('character').value;
  document.getElementById('value').value = value;
  console.log(value);
}

并且输入控件中缺少 ID 属性: <input list="character" name="charselect" id='value'/>

This value would then be input into a specific cell (call it Summary C55 for now).

至于将 selection 写回电子表格,您可以将其添加到 select 函数 的末尾:google.script.run.withSuccessHandler(selectionWritten).writeSelection(value);.

您可以使用类似以下内容来确认 HTML 上的操作:

function selectionWritten() {
  console.log('selection written to spreadsheet');
}

然后您在 Apps 脚本端包含如下内容:

function writeSelection(value){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getSheetByName("Summary");
  sheet.getRange('C55').setValue(value);
}

根据我的尝试,它似乎适用于这些额外的更改。