Календарь Google Sheets - PullRequest
       2

Календарь Google Sheets

0 голосов
/ 05 ноября 2019

Мне нужна помощь в извлечении определенных данных из формы 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,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.


    };

  };
};

1 Ответ

1 голос
/ 06 ноября 2019

Вы создаете календарь выхода на основе электронных таблиц на основе информации из ответа формы. Основываясь на существующем календаре, у вас возникают проблемы с определением соответствующих дат отпуска, а затем с заполнением ячеек календаря для указания предлагаемого отпуска.

Проблема в том, что в строках 1, 2 или 3 календаря нет полей, которые имеюттот же формат даты, что и в полях «Дата начала» и «Дата окончания» в форме. В результате нет простого способа поиска совпадения полей данных формы.

Решение, на мой взгляд, состоит в том, чтобы изменить формат полей даты в строках 2 и 3 и включить поискдля совпадения.

Строка 2

  • существующий формат "d" - день месяца (числовой)
  • изменитьформат, соответствующий дате начала / окончания формы: "d-MMM-yyyy".
  • цвет шрифта для этого поля можно использовать, чтобы «скрыть» эти даты, а также уменьшить ширину столбца.

Строка 3

  • существующий формат «E» - день недели (имя)
  • изменить формат, чтобы объединить существующие форматы строк № 2 и № 3 - «Ed»

Аспекты сценария

  • данные формы извлекаются как getDisplayValues(). Целью этого является получение даты в виде строки для облегчения поиска.
  • Получены два набора данных календаря
    1) строка дат (строка № 2)
    2) именастолбец (Кол. № 1). Метод Javascript map используется для преобразования имен из двумерного массива в одномерный массив. Это создает массив, который можно легко найти.
  • метод Javascript indexOf используется для поиска совпадения столбцов для дат начала и окончания, а также для сопоставления имени в столбце календаря (который выдает строку)
  • скрипт перебирает количество оставшихся дней для создания временного массива значений "V".
  • с использованием номера строки и номеров начала и конца столбца, aдиапазон может быть определен в календаре, а затем обновлен из значений во временном массиве.

Предположительно, ваша функция будет запущена с помощью 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,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]);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...