Javascript 谷歌日历
我想得到一些帮助,从链接到电子表格的谷歌表单中提取某些数据,并在某个员工的日期中设置某个值。例如,如果他/她标记为休假,则字母V将标记在日期下。我把这个链接附在我的日历上,举个例子,我试着在网上搜索,这是我第二次在这里发帖 我开始编写代码,但我陷入了寻找特定日期的手机并插入字母的困境Javascript 谷歌日历,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我想得到一些帮助,从链接到电子表格的谷歌表单中提取某些数据,并在某个员工的日期中设置某个值。例如,如果他/她标记为休假,则字母V将标记在日期下。我把这个链接附在我的日历上,举个例子,我试着在网上搜索,这是我第二次在这里发帖 我开始编写代码,但我陷入了寻找特定日期的手机并插入字母的困境 函数setData(){ //电子表格 var ss=电子表格应用程序; var data=ss.getActiveSpreadsheet().getSheetByName(“数据”); var calendar
函数setData(){
//电子表格
var ss=电子表格应用程序;
var data=ss.getActiveSpreadsheet().getSheetByName(“数据”);
var calendar=ss.getActiveSpreadsheet().getSheetByName(“日历”);
//从窗体中获取最后一行/单个单元格
var lRow=data.getLastRow();
var lRowData=data.getRange(lRow,1,1,17).getValues();
var approval=data.getRange(lRow,17,1,1).getValue();
var leave=data.getRange(lRow,9,1,1).getValue();
var agentName=data.getRange(lRow,5,1,1).getValue();
var dateBefore=data.getRange(lRow,10,1,1).getValue();
var dateAfter=data.getRange(lRow,11,1,1).getValue();
//Calander变量数组
var allDates=calendar.getRange(“LA1:NJ1”).getValues();
var allNames=calendar.getRange(“A4:A160”).getValues();
对于(var i=0;i您正在根据表单响应中的信息构建基于电子表格的休假日历。根据您现有的日历,您在识别相关休假日期,然后填充日历单元格以指示拟议休假时遇到问题
问题是日历的第1、2或3行中没有与表单上的开始日期和结束日期字段具有相同日期格式的字段。因此,无法轻松搜索表单数据字段的匹配项
在我看来,解决方案是更改第2行和第3行中日期字段的格式,并启用匹配的搜索
第2行
- 现有格式为“d”-月日(数字)
- 更改格式以匹配表格开始/结束日期:“d-MMM-yyyy”
- 此字段的字体颜色可用于“隐藏”这些日期,列宽也可减小
第3行
- 现有格式为“E”-星期几(名称)
- 更改格式以合并第2行和第3行的现有格式-“E-d”
脚本的各个方面
- 表单数据以
getDisplayValues()
的形式检索。其目的是以字符串形式获取日期,以便于搜索
- 获得两组日历数据
1) 日期行(第2行)
2) 名称列(Col#1)。Javascript方法用于将名称从二维数组转换为一维数组。这将创建一个易于搜索的数组
- Javascript方法用于查找与开始日期和结束日期匹配的列,以及与日历列中的名称匹配(从而生成行)
- 该脚本循环计算休假天数,以创建“V”值的临时数组
- 使用行号以及开始和结束列号,可以在日历上定义一个范围,然后根据临时数组中的值进行更新
假设您的函数将由onFormSubmit(e)触发
表单数据
日历-之前
日历-在
函数so5871726503(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var form=ss.getSheetByName(“表格”);
var calendar=ss.getSheetByName(“日历”);
//获取表单数据
var formdataRange=form.getRange(6,1,1,9);//测试数据
var formData=formdataRange.getDisplayValues();//显示值以将日期格式化为字符串
//获取员工姓名、开始日期和结束日期
var formName=formData[0][1];
var formSD=formData[0][3];
形成的var=formData[0][4];
//Logger.log(“调试:名称=“+formName+”,开始日期=“+formSD+”,结束日期=“+formED”);
//获取日历变量
var calLR=calendar.getLastRow();
var calLC=calendar.getLastColumn();
var caldateStart=9;
var calnameStart=4;
//获取日历日期
var calDateRange=calendar.getRange(2,caldateStart,1,calLC caldateStart+1);
var calDateValues=calDateRange.getDisplayValues();
//获取日历名称
var calNameRange=calendar.getRange(calnameStart,1,calLR calnameStart+1);
var calNameValues=calNameRange.getValues();
var calNames=calNameValues.map(函数(e){returne e[0];});//[[e],[e]]=>[e,e,e]
//如果存在不匹配,则应在indexof results=-1上进行一些错误检查。
//在日历中查找表单开始日期
var startdateresult=calDateValues[0].indexOf(formSD);
var startdateresultcol=startdateresult+caldateStart;
//Logger.log(“调试:开始日期结果=“+startdateresult+”,列=“+startdateresultcol”);
//在日历中查找表单结束日期
var enddateresult=calDateValues[0]。indexOf(已形成);
var enddateresultcol=enddateresult+caldateStart;
//Logger.log(“调试:结束日期结果=“+enddateresult+”,column=“+enddateresultcol”);
//在日历中查找表单名称
var namesult=calNames.indexOf(formName);
var namerestrow=namereult+calnameStart;
//Logger.log(“调试:名称结果=“+nameresult+”,行=“+nameresultrow”)
//计算休假天数
var daysleave=enddateresultcol startdateresultcol+1
//Logger.log(“调试:休假天数=“+daysleave”)
//创建数组变量以保存休假数据
var左=[];
//循环创建数据以填充日历
对于(i=0;i您正在根据表单响应中的信息构建基于电子表格的休假日历。根据您现有的日历,您在识别相关休假日期,然后填充日历单元格以指示拟议休假时遇到问题
问题是在的第1、2或3行中没有字段
function setData(){
//Spreadsheets
var ss = SpreadsheetApp;
var data = ss.getActiveSpreadsheet().getSheetByName("Data");
var calendar = ss.getActiveSpreadsheet().getSheetByName("Calendar");
//Get last row / Individual Cells from Form
var lRow = data.getLastRow();
var lRowData = data.getRange(lRow,1,1,17).getValues();
var approval = data.getRange(lRow,17,1,1).getValue();
var leave = data.getRange(lRow,9,1,1).getValue();
var agentName = data.getRange(lRow, 5,1,1).getValue();
var dateBefore = data.getRange(lRow, 10,1,1).getValue();
var dateAfter = data.getRange(lRow, 11,1,1).getValue();
//Calander Variable Arrays
var allDates = calendar.getRange("LA1:NJ1").getValues();
var allNames = calendar.getRange("A4:A160").getValues();
for(var i = 0; i<allNames.length; i++){
if (approval === "Approved" && allNames[i][0] === agentName){
//Here I need it to insert the dates under the correct name and date with a value of V H S M U T.
};
};
};
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,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,1,calLC-caldateStart+1);
var calDateValues = calDateRange.getDisplayValues();
// get Calendar names
var calNameRange = calendar.getRange(calnameStart,1,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,1,daysleave);
//Logger.log(calLeave.getA1Notation()); //DEBUG
// Update the leave range
calLeave.setValues([leave]);
}