311-data icon indicating copy to clipboard operation
311-data copied to clipboard

Complete contact form functionality with Google Form

Open Skydodle opened this issue 1 year ago • 5 comments

Overview

We need to complete the contact form functionality so that users may submit their feedbacks/ concerns as a Github issue on our repo using the form.

More Info

We will integrate Google Form on the Contact Page and replace the current form. Access token would be store in Apps Script project. Users would also receive a confirmation email after feedback submission.

Action Items

  • [x] (Dev Lead/PM) Create a 311 bot account
  • [x] (Dev Lead/PM) From the bot account, create a personal access token with the repo scope.
  • [x] Create a Google Form with 311's Google account
    • [x] Edit the Google Form's script via Google Apps Script, so that on form submit it will post to 311's Github repo as an issue
    • [x] On the Google Form, click on the three-dots(more) on top right corner, go to Script editor from drop-down
    • [x] In Apps Script project, store the github token as a variable in Script Properties, ie. GITHUB_TOKEN
    • [x] In Apps Script project, create a script to extract form responses (docs: Apps Script API on FormResponse), and make a post request to Github using the token variable (docs: Github REST API)
    • [x] Test the form submission to see if new issue is created on repo
  • [x] Install the Email Notification extension on the Google Form and configure confirmation email on form submit
  • [x] Embed the Google Form on the Contact page in place of the current contact form

Update 06-27-24: Removing EmailJS from implementation due to EmailJS API restricts request from non-browser environment like Google Apps Script. We will be using an Google Form Extension to send confirmation email instead.

  • [x] ~~(Dev Lead/PM) Create a EmailJS account using HackForLA, sign up here.~~
    • [x] ~~Create an email service.~~
    • [x] ~~Create an email template.~~
    • [x] ~~Gather the email service and email template ID (update -- see this comment for info)~~
  • [x] ~~Update script in Apps Script to make request to EmailJS on form submit~~
    • [x] ~~Test on form submission to see if email is received~~

Resources/Instructions

Script to put in Apps Script

function onFormSubmit(e) {
  const formResponse = e.response; // Use the FormResponse object
  const itemResponses = formResponse.getItemResponses(); // Get all item responses

  // Extract responses using the correct indices
  const fullName = itemResponses[0].getResponse(); // Full Name
  const email = itemResponses[1].getResponse(); // Email
  const neighborhoodAssociation = itemResponses[2].getResponse() || 'Not provided'; // Neighborhood Association
  const message = itemResponses[3].getResponse(); // Message

  // Construct title and body for GitHub issue
  const title = `Feedback from ${fullName} (${email})`;
  const body = `**Full Name:** ${fullName}\n**Email:** ${email}\n**Neighborhood Association:** ${neighborhoodAssociation}\n**Message:**\n${message}`;

  // GitHub API configuration
  const GITHUB_ORG = 'hackforla'; // Replace with your organization name
  const GITHUB_REPO = '311-data'; // Replace with the repository name
  const GITHUB_TOKEN = PropertiesService.getScriptProperties().getProperty('GITHUB_TOKEN');

  const url = `https://api.github.com/repos/${GITHUB_ORG}/${GITHUB_REPO}/issues`;
  const payload = {
    'title': title,
    'body': body
  };

  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      'Authorization': `token ${GITHUB_TOKEN}`
    },
    'payload': JSON.stringify(payload)
  };

  // Sending the request to create the GitHub issue
  const response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}


function setUpTrigger() {
  const form = FormApp.getActiveForm();
  ScriptApp.newTrigger('onFormSubmit')
           .forForm(form)
           .onFormSubmit()
           .create();
}

Skydodle avatar Jun 24 '24 23:06 Skydodle

Approving as a repurpose of this ticket, replacing Google Apps Script instead of OctokitJS: https://github.com/hackforla/311-data/issues/1682

ryanfchase avatar Jun 24 '24 23:06 ryanfchase

This ticket is ready to be picked up (aka resumed by @Skydodle)

ryanfchase avatar Jun 24 '24 23:06 ryanfchase

ETA: Friday 6/28 Availability: M-F

Skydodle avatar Jun 26 '24 16:06 Skydodle

The Google Form is embeded on the Contact Page. Both features of posting to Github issue and send email confirmation are completed. Just waiting on the bot account to be created and provide me with the access token. Thanks.

Skydodle avatar Jun 28 '24 00:06 Skydodle

@Skydodle we were able to move forward with creating the bot. It has read/write permissions for 311-Data and 311-Data-Write teams.

Bot Info

  • name: Roan Box
  • github-id: RoanBox
  • Personal Access Token (classic)
    • repo (all sub-checkboxes checked)
    • workflow
    • notification

Accessing the Personal Access Token

  • available in 1Password in the 311-Data Vault
    • do not use the account in 311-Data-Dev, this profile is outdated and does not have the profile info
  • in the Github item...
    • Personal Access Token > Token (copy/reveal)
    • please be careful not to accidentally paste this in a public location (Slack/Github comment)

ryanfchase avatar Jun 28 '24 19:06 ryanfchase