Google Webapp:如何将数组值动态传递给jquery脚本 发件人:收件人:发件人:收件人:关于问题1:发件人:收件人:关于问题2:发件人:收件人: HTML和Javascript:Page.html HTML和Javascript:JavaScript.html

我一直在寻找StackOverflow问题Datepicker: Disabling dates in the data的答案。我已经成功开发了一个小型的Webapp,它使用beforeShowDay选项和一组硬编码的日期从jQuery Datepicker中排除了特定的日期。

问题

目前,排除日期的数组是硬编码的,但是这些日期应动态生成。尽管我在code.gs getuserdates()中有一个函数,该函数将返回“ userdates”数组["12/13/2019","12/14/2019","12/16/2019","12/17/2019","12/24/2019"],但我在网上找不到一个引用来解释如何将数组值动态传递给webapp。

@Tanaike对Disable dates in the datepicker based on values from the Google Sheet using Google Apps Script的回答似乎与此问题有关,但是我无法适应任何包含数组的成功代码。我认为部分问题是Tanaike的答案是100%使用Javascript,而这种情况需要Javascript和jQuery。

我尝试了scriptlet(不希望它们起作用,但您永远不会知道。它们都产生了错误Uncaught SyntaxError: Unexpected token '<'

  • var userdates = <? getuserdates(); ?>

  • var userdates = <?= getuserdates(); ?>

  • var userdates = <?!= getuserdates(); ?>

目标 要动态更新变量array的值。

Link to Spreadsheet

Latest webapp url (updated)

代码

以下代码可完美运行;唯一的问题是数组值是硬编码的。

code.gs

function doGet(request) {
  return HtmlService.createTemplateFromFile('Page')
      .evaluate();
}

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

function getuserdates() {
  var ss = Spreadsheetapp.getactiveSpreadsheet()
  var sheetname = "VL Request";
  var datasheet = ss.getSheetByName(sheetname);

  // assume user name
  //var username = Session.getEffectiveUser().getusername()
  var username = "user1";

  // set variables
  var datafirstrow = 2;
  var dataLR = datasheet.getLastRow();
  var dataLC = datasheet.getLastColumn();
  var datasheetRange = datasheet.getRange(datafirstrow,1,dataLR-datafirstrow+1,dataLC);
  //Logger.log(datasheetRange.geta1Notation());

  // sort the data by date
  datasheetRange.sort(6); // sort by Column F - VL date
  var datasheetData = datasheetRange.getDisplayValues();
  //Logger.log(datasheetData);

  //   get the user names as an array
  var datanames = datasheetData.map(function(e){return e[2];});//[[e],[e],[e]]=>[e,e,e]
  //Logger.log(datanames); // DEBUG
  //Logger.log(datanames.length) // DEBUG

  // create an array to hold any dates
  var userdates = [];

  //  loop through the user names; test for equivalence to "username",and save VF date to an array
  for (var i=0;i<datanames.length;i++){
    //Logger.log("dataname = "+datanames[i])
    if (datanames[i] === username){
      // Logger.log("DEBUG: i= "+i+",user name = "+datanames[i]+",VL date = "+datasheetData[i][5]);
      userdates.push('"' + datasheetData[i][5]+ '"');
    }
    else{
      // Logger.log("DEBUG: i= "+i+" - no match");
    }
  }
  // resort the data by Timestamp
   datasheetRange.sort(1); // sort by Column A

  if (userdates.length !=0){
  //Logger.log("There are "+userdates.length+" previous dates for this user.");//DEBUG
  }
  else{
  //Logger.log("There no previous dates for this user");//DEBUG
  }

  //Logger.log(userdates);
  return userdates;
}

Page.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/themes/cupertino/jquery-ui.css">
    <?!= include('Stylesheet'); ?>
  </head>
  <body>
  <div class="demo" >
    <h1>jQuery datepicker</h1>
     <p>click here : <input type="text" name="date" id="datepicker" /></p>
  </div>
    <?!= include('JavaScript'); ?>
  </body>
</html>

JavaScript.html

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<script>
var userdates = ["12/13/2019","12/24/2019"];

$(function() {
  $('#datepicker').datepicker({
    minDate: "+3W",maxDate: "+12W",beforeShowDay: function (date) {
      $thisDate = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();
      if ($.inArray($thisDate,userdates) == -1) {
        return [true,""];
      } else {
        return [false,"","Unavailable"];
      }
    }
  });
});
</script>
huyang1644 回答:Google Webapp:如何将数组值动态传递给jquery脚本 发件人:收件人:发件人:收件人:关于问题1:发件人:收件人:关于问题2:发件人:收件人: HTML和Javascript:Page.html HTML和Javascript:JavaScript.html

当Google Apps脚本端的getuserdates()返回值["12/13/2019","12/14/2019","12/16/2019","12/17/2019","12/24/2019"]时,userdates的{​​{1}}是字符串类型的var userdates = <?= getuserdates(); ?>。我以为这样,您的脚本不起作用。

因此,作为几个答案之一,这个答案如何?请修改12/13/2019,12/14/2019,12/16/2019,12/17/2019,12/24/2019

模式1:

在此模式下,将使用脚本。我认为this thread可能有用。

发件人:

JavaScript.html

收件人:

var userdates = ["12/13/2019","12/24/2019"];
  • 运行脚本时,var userdates = []; <? var data = getuserdates(); ?> <? for (var i = 0; i < data.length; i++) { ?> userdates.push(<?= data[i] ?>); <? } ?> userdates
  • 作为使用脚本的另一种模式,例如,如果要使用["12/13/2019","12/24/2019"],还可以将var userdates = <?= getuserdates(); ?>修改为var userdates = <?= getuserdates(); ?>

模式2:

在这种模式下,使用google.script.run。

发件人:

var userdates = <?= getuserdates() ?>.split(",");

收件人:

var userdates = ["12/13/2019","12/24/2019"];
  • 运行脚本时,将从google.script.run.withSuccessHandler(userdates => { $(function() { $('#datepicker').datepicker({ minDate: "+3W",maxDate: "+12W",beforeShowDay: function (date) { $thisDate = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear(); if ($.inArray($thisDate,userdates) == -1) { return [true,""]; } else { return [false,"","Unavailable"]; } } }); }); }).getuserdates(); 中检索到的userdates用作getuserdates()

注意:

  • 在这种情况下,它假设["12/13/2019","12/24/2019"]返回getuserdates()

参考:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

编辑1:

关于问题1:

关于发生["12/13/2019","12/24/2019"]错误的原因,此问题的原因是Uncaught SyntaxError: Unexpected token '<'。因此,请进行如下修改。

发件人:

<?!= include('JavaScript'); ?>

收件人:

</div>
  <?!= include('JavaScript'); ?>
</body>
  • 在这种情况下,请不要在</div> <script> var userdates = []; <? var data = getuserdates(); ?> <? for (var i = 0; i < data.length; i++) { ?> userdates.push(<?= data[i] ?>); <? } ?> </script> <?!= include('JavaScript'); ?> </body> 的{​​{1}}中添加<script>###</script>
  • 不幸的是,这些脚本似乎无法在脚本中使用。

关于问题2:

关于从JavaScript返回<?!= include('JavaScript'); ?>的原因,此问题的原因是[""12/11/2019"",""12/15/2019"",""12/16/2019"",""12/17/2019"",""12/24/2019""]。因此,请进行如下修改。

发件人:

getuserdates()

收件人:

userdates.push('"' + datasheetData[i][5]+ '"');

编辑2:

使用模式1时,脚本如下。关于GAS方面的userdates.push('"' + datasheetData[i][5]+ '"'); ,请从userdates.push(datasheetData[i][5]); 修改为getuserdates()。并且请按如下所示修改HTML和Javascript方面。

HTML和Javascript:Page.html

userdates.push('"' + datasheetData[i][5]+ '"');

HTML和Javascript:JavaScript.html

userdates.push(datasheetData[i][5]);
,

您可以使用客户端代码从Apps脚本运行时获取值。

为此,您需要处理使用withSuccessHandler function调用的函数的响应。

更改您的函数以使用后端返回的日期创建DatePicker的过程如下:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<script>
function onSuccess(value) {
  var userdates = value;
  $('#datepicker').datepicker({
    minDate: "+3W",beforeShowDay: function (date) {
      $thisDate = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();
      if ($.inArray($thisDate,userdates) == -1) {
        return [true,""];
      } else {
        return [false,"Unavailable"];
      }
    }
  });
}

google.script.run.withSuccessHandler(onSuccess).getuserdates();
</script>
本文链接:https://www.f2er.com/3120284.html

大家都在问