Google表格日历

在从链接到电子表格的Google表单中提取某些数据并在某个员工的日期中设置某个值方面,我需要一些帮助。例如,如果他/她标记为休假,则字母V将标记在日期下方。我已将链接附加到我的日历上以举一个例子,我尝试过搜索网络,这是我第二次在这里发布。

我启动了代码,但实际上我只能在某个日期找到单元格并插入字母。

https://docs.google.com/spreadsheets/d/1uFTR2_B7T0QBr7fTflByFffmmiszbNj_RaCvLEfYRCA/edit?usp=sharing

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,17).getvalues();
  var approval = data.getRange(lRow,17,1).getvalue();  
  var leave = data.getRange(lRow,9,1).getvalue(); 
  var agentName = data.getRange(lRow,5,1).getvalue();
  var dateBefore = data.getRange(lRow,10,1).getvalue();
  var dateAfter = data.getRange(lRow,11,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.


    };

  };
};
emheiyan 回答:Google表格日历

您正在基于表单响应中的信息构建基于电子表格的请假日历。根据您现有的日历,您在确定相关休假日期,然后填写日历单元以指示建议休假时遇到问题。

问题在于,日历的第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)触发。


表单数据

Form data


日历-之前

Calendar - Before


日历-之后

Calendar-After


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

大家都在问