Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 日期选择器:禁用数据中的日期_Jquery_Google Apps Script - Fatal编程技术网

Jquery 日期选择器:禁用数据中的日期

Jquery 日期选择器:禁用数据中的日期,jquery,google-apps-script,Jquery,Google Apps Script,我有一个日期选择器,它可以从现在(开始)到12周(结束)之间的3周。我想添加一个条件,如果该跨度上的日期已经在数据(电子表格)中,它也将被禁用。请参见下面的脚本: <script> var data = SpreadsheetApp .openById('Spreadsheet ID') .getSheetByName("VL Request") .getDataRange() .getValues();

我有一个日期选择器,它可以从现在(开始)到12周(结束)之间的3周。我想添加一个条件,如果该跨度上的日期已经在数据(电子表格)中,它也将被禁用。请参见下面的脚本:

 <script>

   var data = SpreadsheetApp
        .openById('Spreadsheet ID')
        .getSheetByName("VL Request")
        .getDataRange()
        .getValues();  
   var datefiled = [0];
   var userName = Session.getEffectiveUser().getUsername();


      $( function() {
      //enable next week onwards 
    var date = new Date();
    var weekday = date.getDay();
    var daysTillWeekOver = 21 - weekday;
    var enddayofweek = daysTillWeekOver + 5;
        $("#datepicker").datepicker({
      minDate:daysTillWeekOver,
      maxDate: "3M" + enddayofweek
      });
      } );
</script>

var数据=电子表格应用程序
.openById(“电子表格ID”)
.getSheetByName(“VL请求”)
.getDataRange()
.getValues();
var datefield=[0];
var userName=Session.getEffectiveUser().getUsername();
$(函数(){
//从下周开始启用
变量日期=新日期();
var weekday=date.getDay();
var daysTillWeekOver=21-工作日;
var enddayofweek=daysTillWeekOver+5;
$(“#日期选择器”)。日期选择器({
minDate:Daysillweekover,
最大日期:“3M”+周末结束
});
} );

我想添加一个条件,即如果用户为该日期(DateField)存档,则将在该用户的日期选择器上禁用该日期,以便用户避免在该日期存档副本。

您想限制JQuery日期选择器以排除用户先前选择的日期。这意味着每次使用脚本时,要排除的日期可能会有所不同

主题(@Amal的道具)显示datepicker脚本需要一个简单的日期数组。然而,我发现每个显示BeforeShowDay用法的示例都假定排除的日期硬编码到脚本中。这在您的场景中是不可接受的,因为用户的可变性以及用户先前选择的日期

下面是一个完整的webapp,它获取电子表格数据并搜索用户名实例,获取相关VL日期,将日期推送到webapp读取的数组中,然后由日期选择器拾取并反映在浏览器中


排除日期的示例

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]+ '"');
      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;
}
道具和他们的建议,用于设计将日期数组传递给webappjavascript的方法

链接到

链接到

注意:脚本假定用户名为“user1”。但是有一行注释(
var userName=Session.getEffectiveUser().getUsername()
)可用于返回实际用户并基于该用户选择日期

需要注意的关键事项是:

  • 数据采集器排除
    (在JavaScript.html中)的基本代码是由Amal提出的
  • 这被包装在一个带有SuccessHandler的
    中,该函数调用函数
    getuserdates()
    (在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]+ '"');
      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;
}
  • getuserdates()
  • var datasheetData=datasheetRange.getDisplayValues():从一开始就获得所有数据:
  • datasheetRange.sort(6)(F列以非零为基础):数据按日期排序,以使输出符合日期顺序:
  • var datanames=datasheetData.map(函数(e){returne e[2];});':用户名列表是使用Javascript[map]提取的(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)方法。
    e[2]`将访问C列,或以零为基础访问第2列)
  • var userdates=[]:设置一个临时数组以捕获以前的日期
  • userdates.push(“''+datasheetData[i][5]+'”):脚本循环用户名,匹配运行脚本的用户的名称,并将相关VL日期提取到临时数组
  • datasheetRange.sort(1):电子表格数据通过时间戳重新调用
  • if(userdates.length!=0){
    :脚本测试是否捕获了以前的日期
  • userdates
    如下所示:
    [“2019年11月11日”、“2019年11月15日”、“2019年11月16日”、“2019年11月17日”、“2019年11月24日”]
日期选择器

  • minDate
    :开始日期为从今天起3周:
    “+3W”
  • maxDate
    :结束日期为从今天起12周:
    “+12W”
  • beforeShowDay
    :这是用于排除特定日期的日期选择器参数。值
    userdates
    getuserdates()返回
  • $thisdate
    定义一个m/d/y的日期格式,然后
  • 如果($.inArray($thisDate,userdates)==-1){
    :使用JQuery方法测试数组日期是否等于日历日期;如果不匹配,则返回-1。因此,当进行匹配时,函数返回“false”=0,并且日历中的日期为“灰显/模糊”

代码.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]+ '"');
      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;
}
功能数据集(请求){
返回HtmlService.createTemplateFromFile('页面')
.评估();
}
函数包括(文件名){
返回HtmlService.createHtmlOutFromFile(文件名)
.getContent();
}
函数getuserdates(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheetname=“VL请求”;
var数据表=ss.getSheetByName(sheetname);
//使用用户名
//var userName=Session.getEffectiveUser().getUsername()
var username=“user1”;
//设置变量
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());
//按日期对数据进行排序
datasheetRange.sort(6);//按F列排序-VL日期
var datasheetData=datasheetRange.getDisplayValues();
//Logger.log(数据表数据);
//将用户名作为数组获取
var datanames=datasheetData.map(函数(e){returne e[2];});//[[e],[e]]=>[e,e,e]
//Logger.log(数据名);//调试
//Logger.log(datanames.length)//调试
//创建一个数组来保存任何日期
var用户日期
<style>
.demo { margin: 30px ; color : #AAA ; font-family : arial sans-serif ;font-size : 10pt } 
p { color : red ; font-size : 14pt } 
</style>