您正在基于表单响应中的信息构建基于电子表格的请假日历。根据您现有的日历,您在确定相关休假日期,然后填写日历单元以指示建议休假时遇到问题。
问题在于,日历的第1,2或3行中没有与表单上“开始日期”和“结束日期”字段具有相同日期格式的字段。结果,没有简单的方法来搜索表单数据字段的匹配项。
我认为解决方案是更改第2行和第3行中日期字段的格式,并使搜索匹配。
第2行
- 现有格式为“ d”-每月的某天(数字)
- 更改格式以匹配表单开始/结束日期:“ d-MMM-yyyy”。
- 此字段的字体颜色可用于“隐藏”这些日期,并且列宽也减小。
第3行
- 现有格式为“ E”-星期几(名称)
- 更改格式以合并第2行和第3行的现有格式-“ E-d”
脚本方面
- 将表单数据检索为
getDisplayValues()
。这样做的目的是将日期作为字符串获取,以方便搜索。
- 获得两组日历数据
1)日期行(第2行)
2)名称列(Col#1)。 Javascript map方法用于将名称从2D数组转换为1D数组。这样会创建一个易于搜索的数组。
- JavaScript indexOf方法用于查找开始日期和结束日期的列匹配项,并匹配日历列中的名称(产生行)
- 脚本会循环休假天数,以创建“ V”值的临时数组。
- 使用行号以及开始和结束列号,可以在日历上定义一个范围,然后根据临时数组中的值进行更新。
大概您的函数将由onFormSubmit(e)触发。
表单数据
日历-之前
日历-之后
function so5871726503(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var form = ss.getSheetByName("Form");
var calendar = ss.getSheetByName("Calander");
//get form data
var formdataRange = form.getRange(6,1,9);// test data
var formData = formdataRange.getDisplayValues(); // display values to format date as string
//get the employee name,start date and end date
var formName = formData[0][1];
var formSD = formData[0][3];
var formED = formData[0][4];
// Logger.log("DEBUG: name = "+formName+",start date = "+formSD+",end date = "+formED);
//get Calendar variables
var calLR = calendar.getLastRow();
var calLC = calendar.getLastColumn();
var caldateStart = 9;
var calnameStart=4;
// get Calendar dates
var calDateRange = calendar.getRange(2,caldateStart,calLC-caldateStart+1);
var calDateValues = calDateRange.getDisplayValues();
// get Calendar names
var calNameRange = calendar.getRange(calnameStart,calLR-calnameStart+1);
var calNameValues = calNameRange.getValues();
var calNames = calNameValues.map(function(e){return e[0];});//[[e],[e],[e]]=>[e,e,e]
// there should be some error checking on indexof results = -1 in case there is a mismatch.
// find form start date in calender
var startdateresult = calDateValues[0].indexOf(formSD);
var startdateresultcol = startdateresult+caldateStart;
// Logger.log("DEBUG: start date result = "+startdateresult+",column = "+startdateresultcol);
// find form end date in calender
var enddateresult = calDateValues[0].indexOf(formED);
var enddateresultcol = enddateresult+caldateStart;
// Logger.log("DEBUG: end date result = "+enddateresult+",column = "+enddateresultcol);
// find form name in calender
var nameresult = calNames.indexOf(formName);
var nameresultrow = nameresult+calnameStart;
// Logger.log("DEBUG: name result = "+nameresult+",row = "+nameresultrow)
// calculate number of days leave
var daysleave = enddateresultcol-startdateresultcol+1
// Logger.log("DEBUG: days leave = "+daysleave)
// create array variable to hold leave data
var leave=[];
// loop to create data to fill Calendar
for (i=0;i<daysleave;i++){
leave.push("V");
}
// Logger.log(leave); // DEBUG
// build leave range
var calLeave = calendar.getRange(nameresultrow,startdateresultcol,daysleave);
//Logger.log(calLeave.getA1Notation()); //DEBUG
// Update the leave range
calLeave.setValues([leave]);
}
本文链接:https://www.f2er.com/3157303.html