Скрипт для планирования времени занятости, похожий на календарь - PullRequest
1 голос
/ 31 октября 2019

Я работаю над "планировщиком транспортных средств" для моего рабочего места, который будет отображать даты и время, когда грузовик будет недоступен. Вот ссылка на Google Sheets, где запускается скрипт. Я настроил два примера «занятых времен», чтобы показать, что я делаю

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

Я открыт для любых рекомендаций по улучшению этого инструмента, даже если он означает, что что-то лучшее (и бесплатное) уже существует.

Я ценю ваш вклад!

См. Код ниже. .. (Я Смешно новичок в кодировании, так что будьте добры:)

function processForm(formObject){
  var day = formObject.dow;
  var vehicle = formObject.vehicle;
  var jobName = formObject.job;
  var driverName = formObject.driver;
  var duration = formObject.duration;
  var startTime = formObject.startTime;
  var ampm = formObject.ampm;
  var location = formObject.location;
  var returnArray = [day, vehicle, jobName, driverName, duration, startTime, ampm, location]
  var startTimeColumn = 0;
  var startDayColumn = 2;
  var sduration = startTime;
  var ss = SpreadsheetApp.getActive().getSheetByName("Week View");

  if (day=="Monday"){
    startDayColumn = 26;
    }
  else if (day=="Tuesday"){
    startDayColumn = 50;
  }
  else if (day=="Wednesday"){
    startDayColumn = 74;
  }
  else if (day=="Thursday"){
    startDayColumn = 98;
  }
  else if (day=="Friday"){
    startDayColumn = 122;
  }
  else if (day=="Saturday"){
    startDayColumn = 146;
  }

  if (ampm=="PM"){
    startDayColumn+=12;
  }

  if (startTime==12){
    startTime = 0;
  }


  startTimeColumn = parseInt(startTimeColumn) + parseInt(startDayColumn) + parseInt(startTime);

  var columnA = ss.getRange(1,1,ss.getLastRow(),1).getValues();
  for (var rr=0;rr<ss.getLastRow();rr++){
    if (columnA[rr]==vehicle){
      break;
      }


    }
  rr +=1;
  for (var cc=0; cc<duration; cc++){
    var checkColumn = parseInt(cc) + parseInt(startTimeColumn);
    if (ss.getRange(rr, checkColumn).isBlank()){}
    else return "It looks like that time is booked :(";
  }
  var displayString = "Job: " + jobName + String.fromCharCode(10) + "Driver: " + driverName + String.fromCharCode(10) + sduration + ":00 " + ampm + String.fromCharCode(10) + location;
  var merging = ss.getRange(rr,startTimeColumn,1,duration).mergeAcross();
  var enterInfo = ss.getRange(rr, startTimeColumn).setValue(displayString);
  if (rr % 2 == 0){
  enterInfo.setBackgroundRGB(45, 114, 157);
  }
  else {enterInfo.setBackgroundRGB(26, 153, 136);}
  enterInfo.setFontColor('white')
  return "Success! Load has been booked to the scheduler.";

}

1 Ответ

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

Вместо того, чтобы листы перепрыгивали через обручи и создавали интерфейс для вставки данных и календарь для его отображения, почему бы не использовать формы и календарь для всего этого?

Что я имею в виду

  • Листы как долговременная база данных для информации о грузовиках и расписаний
  • Календарь как способ визуализации наличия грузовых автомобилей
  • Формы в качестве интерфейса для ввода данных

Настройка

  • Файл электронной таблицы с таблицей «Список грузовиков».
  • Форма, прикрепленная к ней, которая позволяет пользователям вставлять информацию о грузовикебронирование.

Для выполнения этой работы я ввел некоторые данные из Список грузовых автомобилей :

List of Trucks

Затем я связал форму с этим листом и настроил несколько основных вопросов:

Forms Questions

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

Modified Form Settings

Я добавил скрипт в формы, который заполняет первый вопрос данными из наших листов:

function populateForm() {
  var form = FormApp.getActiveForm();
  var TruckIdQ = form.getItems()[0];

  var truckList = SpreadsheetApp.openByUrl("YOUR SHEET URL").getSheetByName("List of Trucks").getDataRange().getValues().map(function (row) { return row[0]});
  truckList.shift(); //Remove header

  var choices = [];

  for (var i=0; i< truckList.length; i++) {
    choices.push(TruckIdQ.asListItem().createChoice(truckList[i]));
  }

  TruckIdQ.asListItem().setChoices(choices);
}

И установите его на запуск при открытии формы:

Form OnOpen Trigger

После этого я вернулся к своим листам и изменил автоматическийЛист ответов должен иметь более понятное имя: «Заказы».

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

Я создал один с именем «Календарь бронирования грузовиков». следующим образом:

Created Calendar Sharing Settings Notification Settings

Затем я создал новый скриптв формах, отвечающих за заполнение календаря информацией.

function populateCalendar(e) {
  var bookingCalendar = CalendarApp.getCalendarById("CALENDAR ID");

  var questions = FormApp.getActiveForm().getItems();
  var response = e.response.getItemResponses();


  var eventDescription = "";
  var truckname;
  var fromDate, toDate;
  var fromTime, toTime;

  for (var i=0; i< questions.length; i++) {
    eventDescription = eventDescription + questions[i].getTitle() + " : " + response[i].getResponse() + "\n";
    switch (i) {
      case 0:
        //Truck Id
        truckname = response[i].getResponse();
        break;
      case 1:
        //From Date
        fromDate = response[i].getResponse();
        break;
      case 2:
        //To Date
        toDate = response[i].getResponse();
        break;
      case 3:
        //From Time
        fromTime = response[i].getResponse();
        break;
      case 4:
        //To Time
        toTime = response[i].getResponse();
        break;
    }
  }

  var startDateTime = new Date(fromDate + " " + fromTime);
  var endDateTime = new Date(toDate + " " + toTime);

  var newEvent = bookingCalendar.createEvent("Booking "+truckname, startDateTime, endDateTime, {description:eventDescription});
  newEvent.setTag("truck", truckname);
  newEvent.setTag("responseId", e.response.getEditResponseUrl());
  newEvent.setTag("responseUrl", e.response.getId());
}

И создал для него триггер, например:

On Submit Trigger

Теперь, когда я отправляю это в форму:

Form input

я получаю эту запись в моем календаре:

Calendar event created!* ** 1092 1093 *

Надеюсь, это поможет вам!

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