javascript - 以 HTML 形式显示选项值,该值是 Google Apps 脚本代码的输出

标签 javascript html google-apps-script google-sheets

编辑:

我已使用 JavaScript 进行编码,以调用 Google Apps 脚本上的函数,该函数将检查 Google 表格中的数据并获取所需的值。

JavaScript 代码:

   function setTime(){
   var lookDate = document.getElementById("subDate").value;
   google.script.run.withSuccessHandler(dateOk).timeCheck(lookDate);
   }
   
   function dateOk(dateData){
   document.getElementById("subTime").innerHTML = dateData;
   console.log(dateData);
   }

示例场景,当用户在我的 Web 应用程序中选择日期时,它将运行函数 setTime(),然后转到 Google Apps脚本代码。我有两个函数 function timeCheck(lookDate)function testRow(dataDisable,lookDate)。函数 timeCheck(lookDate) 将检查 Google 表格中的值并查找限制,函数 testRow(dataDisable,lookDate) 将查找限制值并进行更改我的 Google 表格中相应列中的值。

对于 Google Apps 脚本:

function timeCheck(lookDate){
  
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Test_Data");  
  var myData = ws.getRange(2, 7, ws.getLastRow()-1, 2).getValues();
  var arrData = [];
  myData.forEach(function(row){
    
  var lookup = lookDate;
  var dte = new Date (row[0]);
  var form = Utilities.formatDate(dte, 'GMT+8', 'MMM dd, yyyy');

    if(form == lookup){
      arrData.push(row[1]); 
    }    
  });
  var myVals = arrData;
  var CheckLimitReached = function (V) {
    var records= {};
    V.forEach(function (x) { records[x] = (records[x] || 0) + 1; });
    var limit_reached = Object.keys(records).filter(function (R) {
      return records[R] >= 3;});
    return limit_reached;
    
  };
   var dataDisable = CheckLimitReached(myVals);
  //testRow(dataDisable,lookDate);
  var list1= testRow(dataDisable,lookDate)
  return list1 
}



function testRow(dataDisable,lookDate){

       var ss = SpreadsheetApp.openByUrl(url); 
  var ts = ss.getSheetByName("Time_Select");
  var checkData = ts.getRange(1, 1, 1, ts.getLastColumn()).getDisplayValues()[0];

  var index = checkData.indexOf(lookDate)+1;
  var x = [];
  var dateValues = ts.getRange(2, index, ts.getLastRow()-1, 1).getValues();
  //var checkSplit = dateValues.map(function(row){return row[0]; });
  for(var i=0;i<dataDisable.length;i++){
    for(var j=0;j<dateValues.length;j++){
      if(dataDisable[i]==dateValues[j][0]){
        dateValues[j][0]="Not Available"
      }
    }
  }
  ts.getRange(2, index, ts.getLastRow()-1, 1).setValues(dateValues);
  var listVal = ts.getRange(2, index, ts.getLastRow()-1, 1);
  var list1 = listVal.getValues();//.toString();
  return list1;
}

该函数的日志结果是:

[19-09-10 13:36:58:034 HKT] [[Not Available], [Not Available], [10:00 AM], [11:00 AM], [12:00 NN], [1:00 PM], [Not Available], [3:00 PM]

我的问题是如何将 html 中的值反射(reflect)为选项。

这是我的 Google 表格的链接:https://docs.google.com/spreadsheets/d/1lEfzjG1zzJVPMN8r-OpeZm6q9_IqSwk9DNCEY-q7ozY/edit?usp=sharing

这是我的网络应用程序的 html 代码:

<!-- DATE SELECTION -->
       <div class="row">
          <div class="input-field col s4">
             <input id="subDate" type="text" class="datepicker">
             <label for="subDate">Select Date</label>
          </div> <!-- CLOSE TIME FIELD -->
       
 <!-- TIME SELECTION -->      
          <div class="input-field col s4">
             <select id="subTime">
                <option value="" disabled selected>Choose your preferred time</option>                  
              <?!= list1; ?>
             </select>
             <label>Select Time</label>
          </div> <!-- CLOSE TIME FIELD -->
       </div> <!-- CLOSE ROW -->

预先感谢您的回答和意见。

编辑/更新:

我已经在 J​​avaScript 中尝试了此代码来删除现有选项并将这些值添加为 HMTL 中的新选项。不幸的是什么也没发生。

JavaScript:

function dateOk(dateData){
console.log(dateData)
var selectRemove = document.getElementById("subTime");
selectRemove.innerHTML = "";
           
for (var option in dateData){
var newOption = document.createElement("option");
newOption.innerHTML = option;
selectRemove.options.add(newOption);
}

问题:如何删除现有的选择选项并将其替换为函数的返回值?或者如何创建一个反射(reflect)值的下拉列表框?

最佳答案

问题:

  • 没有为任何调用的函数提供返回值。
  • innetHtml 应为 innerHTML

片段:

function testRow(dataDisable,lookDate){
  /*...rest of code*/
  var list1 = listVal.getValues();
  Logger.log(list1);
  return list1;//ADDED: returns to `timecheck`
  //REMOVEDdoGet(list1); 
}
function timeCheck(lookDate){
  /*...rest of code*/
  var dataDisable = CheckLimitReached(myVals);
  return testRow(dataDisable,lookDate);//MODIFIED return the value of function `testRow` from `timeCheck` to `dateOk`
}
function dateOk(dateData){
 console.log(dateData);
 document.getElementById("subTime").innerHTML = dateData.reduce((a,c)=>{
    return a+'<option>' + (c[0] === 'Not Available' ? '' : c[0]) + '</option>'
 },'');
}

阅读和练习:

实时片段:

<div class="input-field col s4">
<select id="subTime">
   <option value="" disabled selected>Choose your preferred time</option>                  
 
</select>
<label>Select Time</label>
 </div> <!-- CLOSE TIME FIELD -->
<script>
function dateOk(dateData){
 console.log(dateData);
 document.getElementById("subTime").innerHTML = dateData.reduce((a,c)=>{
return a+'<option>' + (c[0] === 'Not Available' ? '' : c[0]) + '</option>'
 },'');
}
dateOk([["Not Available"], ["10:00AM"], ["5:00PM"]]);//call function as if called from successHandler
</script>

关于javascript - 以 HTML 形式显示选项值,该值是 Google Apps 脚本代码的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780747/

相关文章:

javascript - 我正确处理 SVG 了吗?

javascript - 停止 jquery 动画。构建一个轮播

c# - 完成 HTML 标签

google-apps-script - 如何在 Google Apps 脚本中将页面设置方向从纵向更改为横向?

javascript - 如何通过jquery分解对象

javascript - 从华氏温度转换为摄氏度的问题

html - DIV 元素扩展到浏览器的可见部分之外

html - 如何调整嵌入式 MailChimp 表单的位置

javascript - 我可以使用 Google 应用程序脚本上传多个文件吗?

internationalization - Google Apps 脚本国际化 (i18n)