Попросите своих соавторов или Teams отправлять вопросы GitLab через Google Forms. Эта интеграция помогает вам лучше управлять приемом ваших запросов и с хорошо организованным содержанием, обеспечивая при этом лучший пользовательский опыт при подаче запроса через Google Forms.

Когда ваша команда отправляет проблемы GitLab, иногда может быть проблематично, учитывая саму ее природу, которая не является интуитивно понятной и неорганизованной. Вы можете сделать это немного проще с помощью настраиваемых шаблонов задач и отправки по электронной почте, но это все равно не держит все в правильном порядке. Что, если я скажу вам, что вы можете просто преодолеть этот беспорядок, просто интегрировав Google Forms и GitLab, выполнив следующие шаги?

Не волнуйтесь, он не требует никаких внешних инструментов для интеграции и не стоит вам ни доллара.

Все, что вам нужно, это просто проект Gitlab и учетная запись Google. В конце этого вы узнаете:

  1. Как создать токен доступа GitLab
  2. Создайте многораздельную форму Google Forms
  3. Используйте скрипт Google Apps для подключения Google Forms и Gitlab
  4. Понимание триггеров Apps Script и запросов GitLab API

Чтобы успешно создать интеграцию, выполните следующие шаги:

  1. Создать токен доступа GitLab
  2. Создать гугл форму
  3. Создать скрипт отправки задачи
  4. Настроить триггеры скрипта
  5. Тестирование интеграции

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

Создайте токен доступа GitLab

Начнем с создания токена доступа в GitLab, который позже будем использовать для отправки информации из Google Forms в GitLab.
Чтобы создать свой личный токен, перейдите к своей Account Settingsщелкнув значок учетной записи в правом верхнем углу.

Перейдите на Access tokenстраницу, используя сворачиваемый Left sidebar.

На странице токенов личного доступа:

Создайте новый токен, введя имя ссылки на токен, например «Доступ к Google Forms». Под Scopeselect API оставьте поле Срок действия пустым, если это необходимо.

Не забудьте скопировать токен, так как вы больше не сможете его просмотреть. Если нет, не волнуйтесь, вам просто нужно создать новый токен.

Создать форму Google

Перейдите в Google Формы и создайте новую форму.

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

В упражнении я создаю три разных шаблона для управления запросами на доступ, сообщениями об ошибках и запросами новых функций.

В следующих следующих разделах формы просто используйте приведенные ниже вопросы.

Название вашего запроса
Описание
Запрос от (Команда)[Вариант раскрывающегося списка]
Приоритет [Вариант раскрывающегося списка]
Загрузить [Вариант вложений]

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

После того, как вы настроили форму, перейдите прямо на вкладку Response:

Нажмите Link to Sheets, чтобы записать ответы формы на лист Google, содержимое которого мы затем будем использовать для пересылки запросов в GitLab.

В листе Google вы найдете соответствующие имена столбцов в виде вопросов.

Прежде чем мы настроим сценарий приложения на листе, ниже приведен пример ответов, которые помогут с настройкой на основе настройки формы.

Заголовки создаются по умолчанию вопросами формы. На приведенном выше снимке экрана вы могли бы заметить, что заголовки повторяются три раза, поскольку у нас есть три раздела, основанные на ответах в наших формах. Еще одно замечание: ответы заполняются в соответствии с позицией заголовка раздела в форме. По сути, ответ для первого раздела «Запрос на доступ» находится в первом наборе столбцов, за которыми следуют следующие разделы. Я только что добавил ответы вручную, чтобы показать, как они на самом деле представлены, когда форма активна и начинает поступать ответ.

Создайте скрипт для отправки задачи

Теперь здесь происходит Волшебство! Перейдите к ExtensionsApps Script в меню Листа. В новой вкладке откроется редактор скриптов приложений. Вам просто нужно очистить существующий код и заменить его на приведенный ниже:

/* Inspired from my engineering team but added a little tweak for multi-section form submission.
    -  Create a new GitHub Issue from a Google Form submission - https://gist.github.com/bmcbride/62600e48274961819084 <- works for Github and a fellow engineer was able to change it to GitLab's API
    -  Google Form to Gitlab issue and slack on google app script  - https://gist.github.com/kwmt/e2b5b35c82a75fe18043be5ef0ae83fb
*/

var glToken = "YOUR GITLAB TOKEN" ;

function onFormSubmit(e) {

  Logger.log(JSON.stringify(e));

  // For fetching email address 
  
  var emailAddress = e.values[1];

  //var emailAddress = email.replace(/@.*$/,"");

  // For fetching request section for templating the issue submission
  
  var requestTemplate = e.values[2];

  //Declaration for the section request
  
  // For fetching issue title 

  var requestTitle = e.values[3] + e.values[8] + e.values[13];
 
  // For fetcing issue requested by

  var requestRequestedby = e.values[5] + e.values[10] + e.values[15];

  
  // For fetching issue priority
  
  var requestPriority = e.values[6] + e.values[11] + e.values[16]; 
  
  // For fetching issue description 
  
  var requestExplanation = e.values[4] + e.values[9] + e.values[14];
  
  // For fetching attachments

  var  attachmentsString = e.values[7] + e.values[12] + e.values[17];

  var attachmentsMarkdown = new Array ();


  // try to find out if the user exists already by searching for their email address
  var userOptions = {
    "method": "GET",
    "headers": {
        "PRIVATE-TOKEN": glToken,
    },
    "contentType": "application/json"
  };
  
  //var request = UrlFetchApp.getRequest("https://gitlab.com/api/v4/users?search=" + emailAddress, userOptions);
  //Logger.log("Request payload: " + request.payload);

  var response = UrlFetchApp.fetch("https://gitlab.com/api/v4/users?search=" + emailAddress, userOptions);
  Logger.log("User Search Response body: " + response.getContentText());

  var gitlabUsername = "";

  try{
    gitlabUsername = JSON.parse(response.getContentText())[0]["username"];
  } catch (e){
    Logger.log("exception:" + e);
  }
  Logger.log("gitlabUsername: " + gitlabUsername);

  // get our attachments if the attachmentsString is not empty
  
  //Logger.log(attachmentsString);

  // Attachment for request

  if (attachmentsString && attachmentsString.length > 0) {
    // get our file attachments
    var attachments = attachmentsString.split(',');

    //Logger.log(attachments);
    
    for (index = 0; index < attachments.length; index++) {
      var gdriveID = attachments[index].split('=').pop();
      Logger.log(gdriveID);

      // payload for our attachment
      var form = {
        file : DriveApp.getFileById(gdriveID).getBlob()
      };

      var fileOptions = {
        "method": "POST",
        "headers": {
          "PRIVATE-TOKEN": glToken,
        },
        "payload": form
      };
      
      
     
      var response = UrlFetchApp.fetch("https://gitlab.com/api/v4/projects/YOURPROJECTPATH/uploads",fileOptions);
      Logger.log("Add Attachment Response body: " + response.getContentText());

      attachmentsMarkdown.push(JSON.parse(response.getContentText())["markdown"]);
    }    
  }
  //Logger.log(attachmentsMarkdown);

  
  
  //Use this for default labeling of issues
  var labels = "issue-workflow::to-do" ;

  // set the priority label
  if (requestPriority.includes("critical")){
    labels += ",priority::1-critical";
    priority = "P1";
  } else if (requestPriority.includes("high")){
    labels += ",priority::2-high";
    priority = "P2";
    
  } else if (requestPriority.includes("medium")){
    labels += ",priority::3-medium";
    priority = "P3";

  } else if (requestPriority.includes("low")){
    labels += ",priority::4-low";
    priority = "P4";

  } else if (requestPriority.includes("")){
    labels += ",priority::4-low";
    priority = "";
  }

  var reqcreatedBy = 
              "Created via Google Form by email: " + emailAddress;

  // CC the user that created the issue in the description

  if (gitlabUsername && gitlabUsername.length > 0) {
    reqcreatedBy += " (@"+ gitlabUsername + ")\n\n" +
      "/cc @" + gitlabUsername;
  }

  
  // You can create multiple issue format based on your form section using the Markdown while 
  // declaring a variable
  
  // For Access issue description

  var accessDescription = reqcreatedBy + 
    "\n\n## Summary\n\n" + requestTitle +
    "\n\n**Request Type:** \n\n" + requestTemplate +
    "\n\n**Initial Priority:** " + priority +
    "\n\n**Requested by:** " + requestRequestedby +
    "\n\n## Detailed explanation\n\n"  + requestExplanation ;
  
  //

  // For Bug issue description

  var bugDescription = reqcreatedBy + 
   "\n\n## Summary\n\n" + requestTitle +
    "\n\n**Request Type:** \n\n" + requestTemplate +
    "\n\n**Initial Priority:** " + priority +
    "\n\n**Requested by:** " + requestRequestedby +
    "\n\n## Detailed explanation\n\n"  + requestExplanation ;
  
  //

  // For Feature issue description

  var featureDescription = reqcreatedBy + 
   "\n\n## Summary\n\n" + requestTitle +
    "\n\n**Request Type:** \n\n" + requestTemplate +
    "\n\n**Initial Priority:** " + priority +
    "\n\n**Requested by:** " + requestRequestedby +
    "\n\n## Detailed explanation\n\n"  + requestExplanation ;
  
  // 
   
  // Selecting the template

  if (requestTemplate.includes("Access")){
    description = accessDescription;
  } if (requestTemplate.includes("bug")){
    description = bugDescription;
  } if (requestTemplate.includes("Feature")){
    description = featureDescription;
  } 

  //add the markdown for our attachments
  for (index = 0; index < attachmentsMarkdown.length; index++) {
    description += "\n\n" + attachmentsMarkdown[index];
  }




  // set the label for the requestedby label 

  if (requestRequestedby.includes("Operations")){
    labels += ",requested-by-ops";
  }
  if (requestRequestedby.includes("Marketing")){
    labels += ",requested-by-marketing";
  }
  if (requestRequestedby.includes("Finance")){
    labels += ",requested-by-finance";
  }
  if (requestRequestedby.includes("Sales")){
    labels += ",requested-by-sales";
  }
  if (requestRequestedby.includes("Engineering")){
    labels += ",requested-by-engineering";
  }
  if (requestRequestedby.includes("Data science")){
    labels += ",requested-by-datascience";
  }
  if (requestRequestedby.includes("Analytics")){
    labels += ",requested-by-analytics";
  }

  // payload for our new issue

  var issuePayload = {
    "title": requestTitle,
    "description": description,
    "labels" : labels
  };
  
  //Logger.log(issuePayload);

  var issueOptions = {
    "method": "POST",
    "headers": {
        "PRIVATE-TOKEN": glToken,
    }, 
    "contentType": "application/json",
    "payload": JSON.stringify(issuePayload)
  };
  
  var response = UrlFetchApp.fetch("https://gitlab.com/api/v4/projects/YOURPROJECTPATH/issues", issueOptions);
  Logger.log("Create Issue Response body: " + response.getContentText());


  // Send an email to the person who created the request to provide them the issue request link

  var subject = "Issue request created: " + JSON.parse(response.getContentText())["references"]["full"];
  var message = "Thank you for submitting a request, you can see your request here on GitLab:\n\n" + 
    JSON.parse(response.getContentText())["web_url"] + "\n\n" + 
    "Someone in the team will get back to your shortly.";
    
  MailApp.sendEmail(emailAddress, subject, message, {name: 'Google Forms Bug Script', noReply : true});

  // Send an email to the you or your team for notifying that a new request has been raised

  var temailAddress = "[email protected]";
  var tsubject = "Issue request created: " + requestTemplate + " by " + requestRequestedby;
  var tmessage = requestRequestedby + " raised a request, click the request link below to take action:\n\n" + 
    JSON.parse(response.getContentText())["web_url"] ;
  
  MailApp.sendEmail(temailAddress, tsubject, tmessage, {name: 'Google Forms Bug Script team notification', noReply : true});

Теперь давайте пройдемся по каждому разделу кода, чтобы понять, как он работает и где вы можете внести изменения в соответствии с вашими потребностями.

Прежде всего, укажите здесь свой токен доступа и убедитесь, что вы добавили путь к проекту GitLab во все экземпляры URL запроса.

// Place for yout token
var glToken = "YOUR GITLAB TOKEN" ;

// Add your GitLab project path in all of the URL request instances
var response = UrlFetchApp.fetch("https://gitlab.com/api/v4/projects/YOURPROJECTPATH/uploads",fileOptions);

Мы используем функцию onFormSubmit для извлечения и отправки данных с листа. e представляет все данные, поступающие с листа.

function onFormSubmit(e)

В приведенном ниже коде мы настраиваем переменные для получения данных с листа по нескольким столбцам, где числовые значения внутри квадратных скобок представляют диапазон столбцов [1] or [2] or [n]


// For fetching email address 
   var emailAddress = e.values[1];

// For fetching request section used for templating the issue submission
   var requestTemplate = e.values[2];

//Declaration for the section request
// For fetching issue title 
  var requestTitle = e.values[3] + e.values[8] + e.values[13];
 
// For fetcing issue requested by
  var requestRequestedby = e.values[5] + e.values[10] + e.values[15];
  
// For fetching issue priority
   var requestPriority = e.values[6] + e.values[11] + e.values[16]; 
  
// For fetching issue description 
  var requestExplanation = e.values[4] + e.values[9] + e.values[14];
  
// For fetching attachments
  var  attachmentsString = e.values[7] + e.values[12] + e.values[17];
  var attachmentsMarkdown = new Array ();

Добавление ярлыков задач

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

//Use this for default labeling of issues
  var labels = "issue-workflow::to-do" ;

Для захвата данных маркировки из ввода формы, таких как Priorityи Request by Team, используйте приведенный ниже блок кода. Вы можете изменить это в зависимости от ваших требований. То же самое относится и к запросу лейблов Team.

// set the priority label
  if (requestPriority.includes("critical")){
    labels += ",priority::1-critical";
    priority = "P1";
  } else if (requestPriority.includes("high")){
    labels += ",priority::2-high";
    priority = "P2";

Примечание.Ярлыки уже должны быть созданы в GitLab, и мы используем этот метод, чтобы просто добавить их при создании задачи.

Индивидуальный шаблон задачи на основе разделов формы

Следующим шагом является создание страницы/шаблона задачи на основе разделов в форме. Поскольку мы используем несколько разделов в нашей форме, вы, в свою очередь, можете изменить внешний вид созданной страницы задачи для каждого раздела, используя Markdown при объявлении текста переменных. Ниже приведен пример одного из них.

// For Access issue description

  var accessDescription = reqcreatedBy + 
    "\n\n## Summary\n\n" + requestTitle +
    "\n\n**Request Type:** \n\n" + requestTemplate +
    "\n\n**Initial Priority:** " + priority +
    "\n\n**Requested by:** " + requestRequestedby +
    "\n\n## Detailed explanation\n\n"  + requestExplanation ;
  
  //

Уведомление по электронной почте Заявителю и Команде/Отдельному лицу

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

// Send an email to the person who created the request to provide them the issue request link

  var subject = "Issue request created: " + JSON.parse(response.getContentText())["references"]["full"];
  var message = "Thank you for submitting a request, you can see your request here on GitLab:\n\n" + 
    JSON.parse(response.getContentText())["web_url"] + "\n\n" + 
    "Someone in the team will get back to your shortly.";
    
  MailApp.sendEmail(emailAddress, subject, message, {name: 'Google Forms Bug Script', noReply : true});

Вы можете изменить электронное письмо, которое отправляется вам / вашей команде, используя приведенный ниже блок кода.

// Send an email to the you or your team for notifying that a new request has been raised

  var temailAddress = "[email protected]";
  var tsubject = "Issue request created: " + requestTemplate + " by " + requestRequestedby;
  var tmessage = requestRequestedby + " raised a request, click the request link below to take action:\n\n" + 
    JSON.parse(response.getContentText())["web_url"] ;
  
  MailApp.sendEmail(temailAddress, tsubject, tmessage, {name: 'Google Forms Bug Script team notification', noReply : true});

Настройте триггеры скрипта

Чтобы сценарий работал во время отправки формы, вам необходимо настроить событие триггера в сценарии приложений в меню левой панели. Нажмите create a new triggers

Выберите указанные ниже параметры во всплывающем меню и нажмите Save.

Если вы столкнулись с каким-либо всплывающим предупреждением, просто нажмите Advanced, затем Go to YOUR SCRIPT NAME (unsafe), затем просто нажмите Allow.

Тестирование интеграции

Момент истины. Если вы следовали всему, как показано выше, то эта часть должна быть легкой прогулкой.

Теперь вернитесь к форме и нажмите кнопку Preview.

Эта опция позволяет заполнить форму и отправить ответ. Просто введите свои ответы в поля и нажмите Submit!

Если конфигурация правильная, вы должны получить уведомление по электронной почте о том, что проблема была отправлена. Воспользуйтесь ссылкой в ​​электронном письме, чтобы проверить отправленную проблему, или просто получите к ней доступ из проектов GitLab на странице Issues.

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

Закрытие

После успешного тестирования вы можете поделиться формой, нажав кнопку Send в своей форме Google, и получить URL для совместного использования с вашими соавторами или командой.
Примечание.Не делайте этого. Не забудьте установить флажок Collect Respondent email address . так как мы будем использовать его для отправки уведомления по электронной почте.

Надеюсь, вы нашли это полезным. Оставайтесь с нами, чтобы узнать больше!