使用从 HTML 到电子表格的相关值时出现问题?

Problems working with dependent values from HTML to Spreadsheet?

我正在研究一个动态相关的下拉菜单,我已经走得很远,通过 Whosebug 学到了很多东西,所以感谢大家。不管怎样,我已经到达了一个停止点,那里有些东西不起作用了?

这是在线脚本的url:https://script.google.com/macros/s/AKfycbzWi3JymieWMAGVLQVl2xEXCd_eo85hWercHAFkNrqH5dkvWWQd/exec

和电子表格的 url:https://docs.google.com/spreadsheets/d/1BK5urtTzqZ2kc89ZnbeMSIm2-bt4KLNTQghsxn0cXBI/edit#gid=0

生成了两个列表,第一个列表列出了电子表格中的所有工作表,第二个列表应该列出第一行中的值。

下面是我的 index.html:

index.html

<div>
<select id="categories" onchange="google.script.run.withSuccessHandler(buildSubCategoriesList)
  .getSubCategories()">
<option>Loading...</option>    
</select>

<select id="subCategories">
<option>Loading...</option>    
</select>

</div>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
</script>

<script>
// This code in this function runs when the page is loaded.
$(function() {
google.script.run.withSuccessHandler(buildCategoriesList)
  .getCategories();
});

function buildCategoriesList(sheetsName) {
var list = $('#categories');
list.empty();
for (var i = 0; i < sheetsName.length; i++) {
list.append('<option value="' + sheetsName[i] + '">' + sheetsName[i] + '</option>');
}
}
</script>

<script>
function buildSubCategoriesList(columnsName) {
var list = $('#subCategories');
list.empty();
for (var i = 0; i < columnsName.length; i++) {
list.append('<option value="' + columnsName[i] + '">' + columnsName[i] + '</option>');
}
}
</script>

这是代码:

code.gs

function doGet(request) {
return HtmlService.createTemplateFromFile('index')
  .evaluate()
  .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
  .getContent();
}

var ss   =  SpreadsheetApp.openById("1BK5urtTzqZ2kc89ZnbeMSIm2-bt4KLNTQghsxn0cXBI");

function getCategories(){
sheetsName = [];
var sheets = ss.getSheets();
for( var i = 0; i < sheets.length; i++ ){
  sheetsName .push(sheets[i].getName() )
};
return sheetsName;
}

function getSubCategories(categories){
columnsName = [];
var sheet = ss.getSheetByName(categories);
var lastCol = sheet.getLastColumn();
var subRange = sheet.getRange("A1"+lastCol);
var columns = subRange.getValues;

for( var i = 0; i < sheets.length; i++ ){
  columnsName .push(columns[i])
};
return columnsName;
}

我已经尝试了很多东西,但我似乎真的无法找到一种方法来完成这项工作。所以我问你们,有什么建议吗?

您的代码中有几处必须更正才能正常工作:

  • index.html 文件: 您在类别 select 的 onchange 事件中对 getSubCategories() 函数的调用没有通过 select编辑值
  • index.html file: 使用选项填充 <select> 元素不会触发更改事件 - 因此您需要手动触发它以更新子类别select
  • code.gs file:getSubCategories() 函数中,您的 getRange() 调用检索了 A 列中的 3 行而不是第 1 行中的 3 个单元格
  • code.gs file: 再次在 getSubCategories() 函数中你的 getValues 调用必须是 getValues();并且由于 getValues() returns 是一个二维数组,您必须仅从第一个数组项(第一行)获取列值,因此它应该是 getValues()[0]

下面附上更正后的工作代码:

code.gs

var ss   = SpreadsheetApp.openById("1BK5urtTzqZ2kc89ZnbeMSIm2-bt4KLNTQghsxn0cXBI");

function doGet(request) {
  return HtmlService.createTemplateFromFile('index')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

function getCategories(){
  var sheetsName = [];
  var sheets = ss.getSheets();
  for( var i = 0; i < sheets.length; i++ ){
    sheetsName.push( sheets[i].getName() )
  }
  return sheetsName;
}

function getSubCategories(categories){
  var columnsName = [];
  var sheet = ss.getSheetByName(categories);
  var subRange = sheet.getRange(1, 1, 1, sheet.getLastColumn());
  var columns = subRange.getValues()[0]; 

  for( var i = 0; i < columns.length; i++ ){
    columnsName.push( columns[i] )
  }
  return columnsName;
}

index.html

<div>
  <select id="categories" onchange="google.script.run.withSuccessHandler(buildSubCategoriesList)
.getSubCategories(this.value)">
    <option>Loading...</option>    
  </select>

  <select id="subCategories">
    <option>Loading...</option>    
  </select>

</div>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<script>
// This code in this function runs when the page is loaded.
$(function() {
  google.script.run.withSuccessHandler(buildCategoriesList).getCategories();
});

function buildCategoriesList(sheetsName) {
  var list = $('#categories');
  list.empty();
  for (var i = 0; i < sheetsName.length; i++) {
    list.append('<option value="' + sheetsName[i] + '">' + sheetsName[i] + '</option>');
  }
  list.trigger("change");
}

function buildSubCategoriesList(columnsName) {
  console.log(columnsName);
  var list = $('#subCategories');
  list.empty();
  for (var i = 0; i < columnsName.length; i++) {
    list.append('<option value="' + columnsName[i] + '">' + columnsName[i] + '</option>');
  }
}
</script>