omnisend, scripts organization
This commit is contained in:
BIN
Scripts/.DS_Store
vendored
Normal file
BIN
Scripts/.DS_Store
vendored
Normal file
Binary file not shown.
1
Scripts/AE_Reminders/.clasp.json
Normal file
1
Scripts/AE_Reminders/.clasp.json
Normal file
@ -0,0 +1 @@
|
||||
{"scriptId":"1TJplbGBnAl-BN8Kuw5jrC3b8LHCSmkrZUvG_KDMTgwQBfESlWL2lDJd4","rootDir":"/Users/normrasmussen/Documents/Northpass/Google_Scripts/AE_Reminders"}
|
||||
217
Scripts/AE_Reminders/AEMissedMeetingData.js
Normal file
217
Scripts/AE_Reminders/AEMissedMeetingData.js
Normal file
@ -0,0 +1,217 @@
|
||||
/*
|
||||
This script sends a daily reminder to the Sales and Marketing channel as to which
|
||||
lines of data are unclean and not filled out. Currently, it is only pulling from the last 5 days.
|
||||
This will be sent out between 3-4pm so that AEs can get their data in and clean before EOD.
|
||||
Any questions or changes needed, see Norm.
|
||||
Webhook URL in this sheet is for #sales-n-marketing channel.
|
||||
*/
|
||||
// Setup of the sheet
|
||||
const sheet = SpreadsheetApp.getActiveSheet();
|
||||
|
||||
// Setup of the date range to compare. Currently, it is using 5 days until Present.
|
||||
var now = new Date();
|
||||
var formatNow = Utilities.formatDate(now, 'America/New_York', 'MM/dd/yyyy'); // Today
|
||||
var daysToSubtract = 2;
|
||||
var withinWeek = new Date(now.getTime()-daysToSubtract*(3600*24*1000));
|
||||
var formatWeek = Utilities.formatDate(withinWeek, 'America/New_York', 'MM/dd/yyyy'); // 5 Days ago
|
||||
|
||||
// Counter for formatting the final list
|
||||
var meetingCount = 0;
|
||||
|
||||
// Other empty Globals
|
||||
var finalAEList;
|
||||
var tagUsers;
|
||||
|
||||
/*
|
||||
This function will create two empty arrays, one for the list of missed entries and one for tagging users in Slack
|
||||
First, the function gets the data ranges in spreadsheed and adds those columns to an array index.
|
||||
Second, the for loop cycles through the super long array (4 results per line). Based on the if statement,
|
||||
the loop removes all arrays that don't fit the statement.
|
||||
*/
|
||||
function findMeetings() { // Setting up data range and empty arrays
|
||||
var startRow = 2; // First row of data to process
|
||||
var numRows = sheet.getLastRow()-1; // Number of rows to process
|
||||
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
|
||||
var data = dataRange.getValues();
|
||||
var slackingAEListOne = [];
|
||||
var tagList = [];
|
||||
|
||||
for (i in data) { // For a data row within the entire data range
|
||||
var row = data[i];
|
||||
let attended = row[6]; // Column G
|
||||
var name = row[1]; // Column - B
|
||||
var date = Utilities.formatDate(row[3],'America/New_York','MM/dd/yyyy'); // Column - D
|
||||
var company = row[4]; // Column - E
|
||||
let missedEntries = [name, date, company, attended];
|
||||
/*
|
||||
Adding a For Loop will pull a result for EACH element, aka 4 results per line.
|
||||
This pulls one for each group of missedEntries
|
||||
This then removes the last value (attended, since we already know it is a blank), converts to a string,
|
||||
and adds to a new array. The counter will compare if there is more than one entry in the array.
|
||||
*/
|
||||
if ((missedEntries[3] == "") && (missedEntries[1] >= formatWeek) && (missedEntries[1] <= formatNow)) {
|
||||
meetingCount += 1;
|
||||
missedEntries.pop();
|
||||
missedEntries.toString();
|
||||
slackingAEListOne.push(missedEntries);
|
||||
//Logger.log(slackingAEListOne);
|
||||
};
|
||||
};
|
||||
/* Now outside of the if statement:
|
||||
the array is built, and we want each group to be on a new line, remove the commas and add a hyphen.
|
||||
The counter counts if there is 1 or more meetings, or not. If 0, it sends a certain message, not tagging anyone.
|
||||
If it is one or more, it splices by the first array (index 0), adds a new line, and replaces commans with hyphens.
|
||||
*/
|
||||
if (meetingCount >= 1) {
|
||||
var slackingAEListTwo = slackingAEListOne.splice(0).join('\n');
|
||||
var finalAEList = slackingAEListTwo.replace(/,/g, ' - ');
|
||||
// This if statement is going to only tag those who appear in the previous list.
|
||||
// No need to tag people who have done their work and contribute to clean data.
|
||||
if (finalAEList.includes('Norm')) {
|
||||
tagList.push('<@U020KRBDSDQ>');
|
||||
}
|
||||
if (finalAEList.includes('Dan')) {
|
||||
tagList.push('<@U01P7DTFSQZ>');
|
||||
}
|
||||
if (finalAEList.includes('Charles')) {
|
||||
tagList.push('<@U01286MQUS2>');
|
||||
}
|
||||
if (finalAEList.includes('Travis')) {
|
||||
tagList.push('<@UFE3T14UX>');
|
||||
}
|
||||
if (finalAEList.includes('Nick')) {
|
||||
tagList.push('<@U0276LMA70F>');
|
||||
}
|
||||
if (finalAEList.includes('Mike')) {
|
||||
tagList.push('<@U027MAQUPM0>');
|
||||
}
|
||||
if (finalAEList.includes('Doug')) {
|
||||
tagList.push('<@U02CK55FHFX>');
|
||||
}
|
||||
if (finalAEList.includes('Isabel')) {
|
||||
tagList.push('<@U03019S7R6F>');
|
||||
}
|
||||
if (finalAEList.includes('Ryan')) {
|
||||
tagList.push('<@U0325CWA3N3>');
|
||||
}
|
||||
var tagUsers = tagList.toString();
|
||||
/*
|
||||
Now, we're building the payload for the Slack Message.
|
||||
This is very specific and prone to errors, so check that it works using Slack's tool:
|
||||
https://app.slack.com/block-kit-builder/
|
||||
|
||||
Copy from Rich:
|
||||
":rotating_light::rotating_light::rotating_light: New Meeting Tracker Alert! :rotating_light::rotating_light::rotating_light:
|
||||
It's your daily reminder to update the new meeting tracker.
|
||||
If you've been tagged, please address this by EOD."
|
||||
*/
|
||||
let payloadText =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":rotating_light::rotating_light::rotating_light: New Meeting Tracker Alert! :rotating_light::rotating_light::rotating_light:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "It's your daily reminder to update the new meeting tracker."
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "If you've been tagged, please address this by EOD."
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": finalAEList // Sends list with AE, meeting date, and company
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "In case you need it, here's a link to the sheet. :point_right:"
|
||||
},
|
||||
"accessory": {
|
||||
"type": "button",
|
||||
"text": {
|
||||
"type": "plain_text",
|
||||
"text": "Sales New Meeting Tracker",
|
||||
"emoji": true
|
||||
},
|
||||
"value": "sales_tracker_link_123",
|
||||
"url": "https://docs.google.com/spreadsheets/d/150nSuHQLJHpJaYdQ6KHeN7nQ6iexwtnQEpicM77PK8A/edit#gid=0 | First Meeting Tracker",
|
||||
"action_id": "button-action"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": tagUsers // Tags with slack user numbers if they appear in finalSend
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
// This is standard operating procedure to creating the payload and destination
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(payloadText),
|
||||
};
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
//Logger.log(sendMsg); // Debug to confirm send
|
||||
//Logger.log(respCode); // Debug to show errors, if any
|
||||
/*
|
||||
This is the else statement that sends a certain message not tagging anyone and saying that data is clean.
|
||||
*/
|
||||
} else {
|
||||
let noMeetingMsg =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":star::star::star: New Meeting Tracker Alert! :star::star::star:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "Good job, everyone! All meetings from the last 5 days are up to date. Keep doing what you're doing!"
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
// This is standard operating procedure to creating the payload and destination
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(noMeetingMsg),
|
||||
};
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
//Logger.log(sendMsg); // Debug to confirm send
|
||||
//Logger.log(respCode); // Debug to show errors, if any
|
||||
}
|
||||
};
|
||||
7
Scripts/AE_Reminders/appsscript.json
Normal file
7
Scripts/AE_Reminders/appsscript.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"timeZone": "America/New_York",
|
||||
"dependencies": {
|
||||
},
|
||||
"exceptionLogging": "STACKDRIVER",
|
||||
"runtimeVersion": "V8"
|
||||
}
|
||||
1
Scripts/Dept_Calendar/.clasp.json
Normal file
1
Scripts/Dept_Calendar/.clasp.json
Normal file
@ -0,0 +1 @@
|
||||
{"scriptId":"1bG7euzp-k-XWRrCkTEwdOLYxuLgIMgzKcfvWjdOKU226uYPC7aTU_JfJ","rootDir":"/Users/normrasmussen/Documents/Northpass/Google_Scripts/Dept_Calendar"}
|
||||
27
Scripts/Dept_Calendar/Code.js
Normal file
27
Scripts/Dept_Calendar/Code.js
Normal file
@ -0,0 +1,27 @@
|
||||
function createEvent() {
|
||||
let calendarID = '';
|
||||
let eventName = '';
|
||||
let startTime = '';
|
||||
let endTime = '';
|
||||
let zoomLink = '';
|
||||
var event = CalendarApp.getCalendarById(calendarID).create(
|
||||
eventName, startTime, endTime, zoomLink);
|
||||
eventID = event.getID();
|
||||
}
|
||||
|
||||
function addLearner(eventID, calendarID) {
|
||||
let attendeeEmail = '{{ current_person.email }}';
|
||||
let calendar = calendarID;
|
||||
let event = eventID;
|
||||
|
||||
let basCalendar = CalendarApp.getCalendarById(calendar);
|
||||
if (basCalendar == null) {
|
||||
return;
|
||||
}
|
||||
let currentEvent = calendar.getEventById(event);
|
||||
if (currentEvent == null) {
|
||||
return;
|
||||
}
|
||||
event.addGuest(attendeeEmail);
|
||||
|
||||
}
|
||||
7
Scripts/Dept_Calendar/appsscript.json
Normal file
7
Scripts/Dept_Calendar/appsscript.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"timeZone": "America/New_York",
|
||||
"dependencies": {
|
||||
},
|
||||
"exceptionLogging": "STACKDRIVER",
|
||||
"runtimeVersion": "V8"
|
||||
}
|
||||
1
Scripts/SDR_Meetings/.clasp.json
Normal file
1
Scripts/SDR_Meetings/.clasp.json
Normal file
@ -0,0 +1 @@
|
||||
{"scriptId":"11ghDxFT1kf_3PLsjOUcd3isFIXoJtyNzu2mEbhdci53nJXYTpSRHYJxl","rootDir":"/Users/normrasmussen/Documents/Northpass/Google_Scripts/SDR_Meetings"}
|
||||
110
Scripts/SDR_Meetings/NewMeetings.js
Normal file
110
Scripts/SDR_Meetings/NewMeetings.js
Normal file
@ -0,0 +1,110 @@
|
||||
const sheetTwo = SpreadsheetApp.getActiveSheet();
|
||||
var now = new Date();
|
||||
var formatToday = Utilities.formatDate(now, 'America/New_York', 'MM/dd/yyyy');
|
||||
|
||||
function newMeetings() {
|
||||
var startRow = 2; // First row of data to process
|
||||
var numRows = sheetTwo.getLastRow()-1; // Number of rows to process
|
||||
var dataRange = sheetTwo.getRange(startRow, 1, numRows, sheet.getLastColumn());
|
||||
var data = dataRange.getValues();
|
||||
var sdrMeeting = [];
|
||||
|
||||
for (i in data) {
|
||||
var row = data[i];
|
||||
var sdr = row[0]; // Column A
|
||||
var date = Utilities.formatDate(row[3],'America/New_York','MM/dd/yyyy'); // Column D
|
||||
var company = row[4]; // Column E
|
||||
var outbound = row[5]; // Column F
|
||||
let sdrMeetingListOne = [sdr, date, company, outbound];
|
||||
if ((sdrMeetingListOne[1] == formatToday) && (sdrMeetingListOne[0] != '') && (sdrMeetingListOne[3] == "Outbound")) {
|
||||
sdrMeetingListOne.toString();
|
||||
sdrMeeting.push(sdrMeetingListOne);
|
||||
Logger.log(sdrMeetingListOne)
|
||||
} else if ((sdrMeetingListOne[1] == formatToday) && (sdrMeetingListOne[0] != '')) {
|
||||
let noMeetingText =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":star: *C'mon team!* :star:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "No new meetings today? We can do better than that! Hustle!"
|
||||
}
|
||||
},
|
||||
]
|
||||
}
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(noMeetingText),
|
||||
}
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
Logger.log(sendMsg);
|
||||
Logger.log(respCode);
|
||||
}
|
||||
};
|
||||
Logger.log(sdrMeeting);
|
||||
var toSend = sdrMeeting.splice(1).join('\n');
|
||||
var getEm = toSend.replace(/,/g, ' - ')
|
||||
Logger.log(getEm)
|
||||
/*
|
||||
let payloadMeetingText =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":star: *Pitter Patter!* :star:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "Here's who has meetings today. Get after it boys and girls!"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": getEm
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "image",
|
||||
"image_url": "https://media.giphy.com/media/3ohjURBuAtWDV8d3SE/giphy.gif",
|
||||
"alt_text": "inspiration"
|
||||
}
|
||||
]
|
||||
}
|
||||
//(array[0] + ", you still need to fill out the cells for" + array[2] + " from " + array[1] + "!\n");
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(payloadText),
|
||||
};
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
Logger.log(sendMsg);
|
||||
Logger.log(respCode);*/
|
||||
};
|
||||
7
Scripts/SDR_Meetings/appsscript.json
Normal file
7
Scripts/SDR_Meetings/appsscript.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"timeZone": "America/New_York",
|
||||
"dependencies": {
|
||||
},
|
||||
"exceptionLogging": "STACKDRIVER",
|
||||
"runtimeVersion": "V8"
|
||||
}
|
||||
1
Scripts/Sheets_to_Jira/.clasp.json
Normal file
1
Scripts/Sheets_to_Jira/.clasp.json
Normal file
@ -0,0 +1 @@
|
||||
{"scriptId":"1VUbCbC6whkodvYSfTSmaFCNVxowtahxUHaKcr7Dg_Ly0vevBLqlDWmdS","rootDir":"/Users/normrasmussen/Documents/Northpass/Google_Scripts/Sheets_to_Jira"}
|
||||
119
Scripts/Sheets_to_Jira/IntoJira.js
Normal file
119
Scripts/Sheets_to_Jira/IntoJira.js
Normal file
@ -0,0 +1,119 @@
|
||||
/* Pertinent Information and Codes:
|
||||
Custom Fields:
|
||||
Channel = customfield_10121
|
||||
Campaign = customfield_10120
|
||||
SDR = customfield_10122
|
||||
Start Date = customfield_10015
|
||||
|
||||
Users:
|
||||
Travis Nardin = 5d9cb42c0265ca0db955b965
|
||||
Dan Peski = 603318815ddf020069969cad
|
||||
Norm Rasmussen = 6092af20d353800068863d15
|
||||
Michael Valido = 61fbf60cd8d7cf006a90941c
|
||||
Jon Newfield = 6092af212c2f6c0068ec92c4
|
||||
Isabel Katz = 620145241fec260068c107e5
|
||||
Charles McGovern = 5eaaf1c4021ae30ba8fcb184
|
||||
Nick Zuppe = 60eddda64257a90070aeebef
|
||||
Doug Goldsmith = 61294a4845f753006951a590
|
||||
Nick Appleby = 6183eab7892c420072f9c437
|
||||
Quba Williams-Wilfong = 62101fe4e41f76006a6f6510
|
||||
|
||||
Without accounts: Adan, Drew
|
||||
|
||||
*/
|
||||
function myFunction() {
|
||||
var URL = "https://northpass.atlassian.net/rest/api/3/issue/";
|
||||
var token = "2NrKYv22TLWnxTo7EhU3633E";
|
||||
var user = "nrasmussen@northpass.com";
|
||||
var UserCredentials = Utilities.base64Encode(user + ":" + token);
|
||||
|
||||
// Setting up data range and empty arrays
|
||||
const sheet = SpreadsheetApp.getActiveSheet();
|
||||
var startRow = 2; // First col of data to process
|
||||
var numRows = 1132; // Number of rows to process
|
||||
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()).getValues();
|
||||
|
||||
for (col in dataRange) { // For a data col within the entire data range
|
||||
var col = dataRange[col];
|
||||
let sdr = col[0]; // Column - A
|
||||
let name = col[1]; // Column - B
|
||||
let bookingDate = Utilities.formatDate(col[2], "America/New_York", "MM/dd/yyyy"); // Column - C
|
||||
let meetingDate = Utilities.formatDate(col[3], "America/New_York", "MM/dd/yyyy"); // Column - D
|
||||
let rawDate = Utilities.formatDate(col[3], "America/New_York", "yyyy-MM-dd");
|
||||
let company = col[4]; // Column - E
|
||||
let channel = col[5]; // Column - F
|
||||
let result = col[7]; // Column - H
|
||||
let campaign = col[8]; // Column - I
|
||||
let info = col[9]; // Column - J
|
||||
let list = [sdr, name, rawDate, bookingDate, meetingDate, company, channel, result, campaign, info];
|
||||
let sdrDict = {
|
||||
"Mike" :
|
||||
"61fbf60cd8d7cf006a90941c",
|
||||
"Nick" :
|
||||
"60eddda64257a90070aeebef",
|
||||
"Appleby" :
|
||||
"6183eab7892c420072f9c437",
|
||||
"Doug" :
|
||||
"61294a4845f753006951a590",
|
||||
"Quba" :
|
||||
"62101fe4e41f76006a6f6510",
|
||||
};
|
||||
if (list.includes("Norm")) {
|
||||
var data = {
|
||||
"fields": {
|
||||
"project": {
|
||||
"key": "NPIPE",
|
||||
},
|
||||
"issuetype": {
|
||||
"id": "10275",
|
||||
},
|
||||
"summary": list[5],
|
||||
"description": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Booked Date - " + list[3] + '\n' +
|
||||
"Meeting Date - " + list[4] + '\n' +
|
||||
"Description from Tracker: " + list[9] + '\n' +
|
||||
"Last Status - " + list[7]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
"customfield_10015": list[2], // Start (Meeting) Date - rawDate
|
||||
"customfield_10127": [ // Campaign
|
||||
list[8],
|
||||
],
|
||||
"customfield_10128": [ // Channel
|
||||
list[6],
|
||||
],
|
||||
"customfield_10129": [{"id" : sdrDict[list[0]]}], // SDR
|
||||
}
|
||||
},
|
||||
payload = JSON.stringify(data);
|
||||
Logger.log(payload);
|
||||
var headers = {
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Basic " + UserCredentials,
|
||||
"muteHttpExceptions": true,
|
||||
}
|
||||
var options = {
|
||||
"method": "POST",
|
||||
"headers": headers,
|
||||
"payload": payload
|
||||
}
|
||||
//Logger.log(options);
|
||||
var response = UrlFetchApp.fetch(URL, options);
|
||||
//Logger.log(response);
|
||||
var respCode = response.getResponseCode();
|
||||
//Logger.log(respCode);
|
||||
}
|
||||
}
|
||||
};
|
||||
7
Scripts/Sheets_to_Jira/appsscript.json
Normal file
7
Scripts/Sheets_to_Jira/appsscript.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"timeZone": "America/New_York",
|
||||
"dependencies": {
|
||||
},
|
||||
"exceptionLogging": "STACKDRIVER",
|
||||
"runtimeVersion": "V8"
|
||||
}
|
||||
1
Scripts/WCA_Webhook/.clasp.json
Normal file
1
Scripts/WCA_Webhook/.clasp.json
Normal file
@ -0,0 +1 @@
|
||||
{"scriptId":"1NKCzBIDEvcD4HUFEXadwtoGbElLem0g0asxQO4lWjCxyp5B-yMvSZnMD","rootDir":"/Users/normrasmussen/Documents/Northpass/Google_Scripts/WCA_Webhook"}
|
||||
47
Scripts/WCA_Webhook/Code.js
Normal file
47
Scripts/WCA_Webhook/Code.js
Normal file
@ -0,0 +1,47 @@
|
||||
function doGet(e) {
|
||||
return HtmlService.createHtmlOutput("get request received");
|
||||
}
|
||||
|
||||
//this is a function that fires when the webapp receives a POST request
|
||||
function doPost(e) {
|
||||
var params = JSON.stringify(e.postData.contents);
|
||||
params = JSON.parse(params);
|
||||
var now = new Date();
|
||||
var timeAdded = Utilities.formatDate(now,'America/New_York','MM/dd/yyyy');
|
||||
|
||||
var learnerName = params.substring(params.indexOf('{"name":"') + 7, params.lastIndexOf('"email"'));
|
||||
learnerName = learnerName.slice(learnerName.indexOf('"') + 1, learnerName.lastIndexOf('"'),);
|
||||
//Logger.log("Name = " + learnerName);
|
||||
|
||||
var learnerEmail = params.substring(params.indexOf('"sso_uid":"') + 9, params.lastIndexOf('"full_name"'));
|
||||
learnerEmail = learnerEmail.slice(learnerName.indexOf('"') + 3, learnerEmail.lastIndexOf('"'),);
|
||||
//Logger.log("Email = " + learnerEmail);
|
||||
|
||||
var courseName = params.substring(params.indexOf('"course_name":"') + 4, params.lastIndexOf('"attributes"'));
|
||||
courseName = courseName.slice(courseName.indexOf('"') + 3, courseName.lastIndexOf('"'),);
|
||||
//Logger.log("Course = " + courseName);
|
||||
|
||||
var activityName = params.substring(params.indexOf('"title":"') + 4, params.lastIndexOf('"course_name"'));
|
||||
activityName = activityName.slice(activityName.indexOf('"') + 3, activityName.lastIndexOf('"'),);
|
||||
//Logger.log("Activity = " + activityName);
|
||||
|
||||
var dateCompleted = params.substring(params.indexOf('"updated_at":"') + 4, params.lastIndexOf('"activated_at"'));
|
||||
dateCompleted = dateCompleted.slice(dateCompleted.indexOf('"') + 3, dateCompleted.lastIndexOf('"'),);
|
||||
//Logger.log("Completed on = " + dateCompleted);
|
||||
|
||||
var sheet = SpreadsheetApp.getActiveSheet();
|
||||
var lastRow = Math.max(sheet.getLastRow(),1);
|
||||
|
||||
sheet.insertRowAfter(lastRow);
|
||||
sheet.getRange(lastRow + 1, 1).setValue(timeAdded);
|
||||
sheet.getRange(lastRow + 1, 2).setValue(learnerName);
|
||||
sheet.getRange(lastRow + 1, 3).setValue(learnerEmail);
|
||||
sheet.getRange(lastRow + 1, 4).setValue(courseName);
|
||||
sheet.getRange(lastRow + 1, 5).setValue(activityName);
|
||||
sheet.getRange(lastRow + 1, 6).setValue(dateCompleted);
|
||||
sheet.getRange(lastRow + 1, 7).setValue(params);
|
||||
|
||||
|
||||
SpreadsheetApp.flush();
|
||||
return HtmlService.createHtmlOutput("post request received");
|
||||
}
|
||||
10
Scripts/WCA_Webhook/appsscript.json
Normal file
10
Scripts/WCA_Webhook/appsscript.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"timeZone": "America/New_York",
|
||||
"dependencies": {},
|
||||
"exceptionLogging": "STACKDRIVER",
|
||||
"runtimeVersion": "V8",
|
||||
"webapp": {
|
||||
"executeAs": "USER_DEPLOYING",
|
||||
"access": "ANYONE_ANONYMOUS"
|
||||
}
|
||||
}
|
||||
219
Scripts/_originals/AE_Reminders_Daily.gs
Normal file
219
Scripts/_originals/AE_Reminders_Daily.gs
Normal file
@ -0,0 +1,219 @@
|
||||
/*
|
||||
This script sends a daily reminder to the Sales and Marketing channel as to which
|
||||
lines of data are unclean and not filled out. Currently, it is only pulling from the last 5 days.
|
||||
This will be sent out between 3-4pm so that AEs can get their data in and clean before EOD.
|
||||
Any questions or changes needed, see Norm.
|
||||
Webhook URL in this sheet is for #sales-n-marketing channel.
|
||||
*/
|
||||
// Setup of the sheet
|
||||
const sheet = SpreadsheetApp.getActiveSheet();
|
||||
|
||||
// Setup of the date range to compare. Currently, it is using 5 days until Present.
|
||||
var now = new Date();
|
||||
var formatNow = Utilities.formatDate(now, 'America/New_York', 'MM/dd/yyyy'); // Today
|
||||
var daysToSubtract = 2;
|
||||
var withinWeek = new Date(now.getTime()-daysToSubtract*(3600*24*1000));
|
||||
var formatWeek = Utilities.formatDate(withinWeek, 'America/New_York', 'MM/dd/yyyy'); // 5 Days ago
|
||||
|
||||
// Counter for formatting the final list
|
||||
var meetingCount = 0;
|
||||
|
||||
// Other empty Globals
|
||||
var finalAEList;
|
||||
var tagUsers;
|
||||
|
||||
/*
|
||||
This function will create two empty arrays, one for the list of missed entries and one for tagging users in Slack
|
||||
First, the function gets the data ranges in spreadsheed and adds those columns to an array index.
|
||||
Second, the for loop cycles through the super long array (4 results per line). Based on the if statement,
|
||||
the loop removes all arrays that don't fit the statement.
|
||||
*/
|
||||
function findMeetings() { // Setting up data range and empty arrays
|
||||
var startRow = 2; // First row of data to process
|
||||
var numRows = sheet.getLastRow()-1; // Number of rows to process
|
||||
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
|
||||
var data = dataRange.getValues();
|
||||
var slackingAEListOne = [];
|
||||
var tagList = [];
|
||||
|
||||
for (i in data) { // For a data row within the entire data range
|
||||
var row = data[i];
|
||||
let attended = row[6]; // Column G
|
||||
var name = row[1]; // Column - B
|
||||
var date = Utilities.formatDate(row[3],'America/New_York','MM/dd/yyyy'); // Column - D
|
||||
var company = row[4]; // Column - E
|
||||
let missedEntries = [name, date, company, attended];
|
||||
/*
|
||||
Adding a For Loop will pull a result for EACH element, aka 4 results per line.
|
||||
This pulls one for each group of missedEntries
|
||||
This then removes the last value (attended, since we already know it is a blank), converts to a string,
|
||||
and adds to a new array. The counter will compare if there is more than one entry in the array.
|
||||
*/
|
||||
if ((missedEntries[3] == "") && (missedEntries[1] >= formatWeek) && (missedEntries[1] <= formatNow)) {
|
||||
meetingCount += 1;
|
||||
missedEntries.pop();
|
||||
missedEntries.toString();
|
||||
slackingAEListOne.push(missedEntries);
|
||||
//Logger.log(slackingAEListOne);
|
||||
};
|
||||
};
|
||||
/* Now outside of the if statement:
|
||||
the array is built, and we want each group to be on a new line, remove the commas and add a hyphen.
|
||||
The counter counts if there is 1 or more meetings, or not. If 0, it sends a certain message, not tagging anyone.
|
||||
If it is one or more, it splices by the first array (index 0), adds a new line, and replaces commans with hyphens.
|
||||
*/
|
||||
if (meetingCount >= 1) {
|
||||
var slackingAEListTwo = slackingAEListOne.splice(0).join('\n');
|
||||
var finalAEList = slackingAEListTwo.replace(/,/g, ' - ');
|
||||
// This if statement is going to only tag those who appear in the previous list.
|
||||
// No need to tag people who have done their work and contribute to clean data.
|
||||
if (finalAEList.includes('Norm')) {
|
||||
tagList.push('<@U020KRBDSDQ>');
|
||||
}
|
||||
if (finalAEList.includes('Dan')) {
|
||||
tagList.push('<@U01P7DTFSQZ>');
|
||||
}
|
||||
if (finalAEList.includes('Charles')) {
|
||||
tagList.push('<@U01286MQUS2>');
|
||||
}
|
||||
if (finalAEList.includes('Travis')) {
|
||||
tagList.push('<@UFE3T14UX>');
|
||||
}
|
||||
if (finalAEList.includes('Nick')) {
|
||||
tagList.push('<@U0276LMA70F>');
|
||||
}
|
||||
if (finalAEList.includes('Mike')) {
|
||||
tagList.push('<@U027MAQUPM0>');
|
||||
}
|
||||
if (finalAEList.includes('Doug')) {
|
||||
tagList.push('<@U02CK55FHFX>');
|
||||
}
|
||||
if (finalAEList.includes('Isabel')) {
|
||||
tagList.push('<@U03019S7R6F>');
|
||||
}
|
||||
if (finalAEList.includes('Ryan')) {
|
||||
tagList.push('<@U0325CWA3N3>');
|
||||
}
|
||||
var tagUsers = tagList.toString();
|
||||
/*
|
||||
Now, we're building the payload for the Slack Message.
|
||||
This is very specific and prone to errors, so check that it works using Slack's tool:
|
||||
https://app.slack.com/block-kit-builder/
|
||||
|
||||
Copy from Rich:
|
||||
":rotating_light::rotating_light::rotating_light: New Meeting Tracker Alert! :rotating_light::rotating_light::rotating_light:
|
||||
It's your daily reminder to update the new meeting tracker.
|
||||
If you've been tagged, please address this by EOD."
|
||||
*/
|
||||
let payloadText =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":rotating_light::rotating_light::rotating_light: New Meeting Tracker Alert! :rotating_light::rotating_light::rotating_light:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "It's your daily reminder to update the new meeting tracker."
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "If you've been tagged, please address this by EOD."
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": finalAEList // Sends list with AE, meeting date, and company
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "In case you need it, here's a link to the sheet. :point_right:"
|
||||
},
|
||||
"accessory": {
|
||||
"type": "button",
|
||||
"text": {
|
||||
"type": "plain_text",
|
||||
"text": "Sales New Meeting Tracker",
|
||||
"emoji": true
|
||||
},
|
||||
"value": "sales_tracker_link_123",
|
||||
"url": "https://docs.google.com/spreadsheets/d/150nSuHQLJHpJaYdQ6KHeN7nQ6iexwtnQEpicM77PK8A/edit#gid=0 | First Meeting Tracker",
|
||||
"action_id": "button-action"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": tagUsers // Tags with slack user numbers if they appear in finalSend
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
// This is standard operating procedure to creating the payload and destination
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(payloadText),
|
||||
};
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
//Logger.log(sendMsg); // Debug to confirm send
|
||||
//Logger.log(respCode); // Debug to show errors, if any
|
||||
/*
|
||||
This is the else statement that sends a certain message not tagging anyone and saying that data is clean.
|
||||
*/
|
||||
} else {
|
||||
let noMeetingMsg =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":star::star::star: New Meeting Tracker Alert! :star::star::star:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "Good job, everyone! All meetings from the last 5 days are up to date. Keep doing what you're doing!"
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
// This is standard operating procedure to creating the payload and destination
|
||||
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(noMeetingMsg),
|
||||
};
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
|
||||
//Logger.log(sendMsg); // Debug to confirm send
|
||||
//Logger.log(respCode); // Debug to show errors, if any
|
||||
}
|
||||
};
|
||||
30
Scripts/_originals/DeptCalendar.gs
Normal file
30
Scripts/_originals/DeptCalendar.gs
Normal file
@ -0,0 +1,30 @@
|
||||
|
||||
|
||||
function createEvent() {
|
||||
let calendarID = '';
|
||||
let eventName = '';
|
||||
let startTime = '';
|
||||
let endTIme = '';
|
||||
let zoomLink = '';
|
||||
var event = CalendarApp.getCalendarById(calendarID).create(
|
||||
eventName, startTime, endTime, zoomLink);
|
||||
eventID = event.getID();
|
||||
}
|
||||
|
||||
|
||||
function addLearner(eventID, calendarID) {
|
||||
let attendeeEmail = '{{ current_person.email }}';
|
||||
let calendarID = calendarID;
|
||||
let eventID = eventID;
|
||||
|
||||
let calendar = CalendarApp.getCalendarById(calendarID);
|
||||
if (calendar == null) {
|
||||
return;
|
||||
}
|
||||
let event = calendar.getEventById(eventID);
|
||||
if (event == null) {
|
||||
return;
|
||||
}
|
||||
event.addGuest(attendeeEmail);
|
||||
|
||||
}
|
||||
29
Scripts/_originals/Gmail_Alerts.gs
Normal file
29
Scripts/_originals/Gmail_Alerts.gs
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
The point of this script is to start a timer for each email that comes in
|
||||
and if the email goes unanswered after a certain amount of time
|
||||
alert the owner of the account being monitored.
|
||||
Hopefully, with a slack message.
|
||||
*/
|
||||
|
||||
var timerCount = 0;
|
||||
var emailSubject = getSubject();
|
||||
var emailTime = getDate();
|
||||
var newEmail;
|
||||
var emailInbox = isInInbox();
|
||||
|
||||
|
||||
function startTImer() {
|
||||
|
||||
}
|
||||
|
||||
function getMessage() {
|
||||
if
|
||||
}
|
||||
|
||||
function compileAlert() {
|
||||
|
||||
}
|
||||
|
||||
function sendAlert() {
|
||||
|
||||
}
|
||||
109
Scripts/_originals/New_SDR_Meetings_msg.gs
Normal file
109
Scripts/_originals/New_SDR_Meetings_msg.gs
Normal file
@ -0,0 +1,109 @@
|
||||
const sheetTwo = SpreadsheetApp.getActiveSheet();
|
||||
var now = new Date();
|
||||
var formatToday = Utilities.formatDate(now, 'America/New_York', 'MM/dd/yyyy');
|
||||
|
||||
function newMeetings() {
|
||||
var startRow = 2; // First row of data to process
|
||||
var numRows = sheetTwo.getLastRow()-1; // Number of rows to process
|
||||
var dataRange = sheetTwo.getRange(startRow, 1, numRows, sheet.getLastColumn());
|
||||
var data = dataRange.getValues();
|
||||
var sdrMeeting = [];
|
||||
|
||||
for (i in data) {
|
||||
var row = data[i];
|
||||
var sdr = row[0]; // Column A
|
||||
var date = Utilities.formatDate(row[3],'America/New_York','MM/dd/yyyy'); // Column D
|
||||
var company = row[4]; // Column E
|
||||
var outbound = row[5]; // Column F
|
||||
let sdrMeetingListOne = [sdr, date, company, outbound];
|
||||
if ((sdrMeetingListOne[1] == formatToday) && (sdrMeetingListOne[0] != '') && (sdrMeetingListOne[3] == "Outbound")) {
|
||||
sdrMeetingListOne.toString();
|
||||
sdrMeeting.push(sdrMeetingListOne);
|
||||
Logger.log(sdrMeetingListOne)
|
||||
} else if ((sdrMeetingListOne[1] == formatToday) && (sdrMeetingListOne[0] != '')) {
|
||||
let noMeetingText =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":star: *C'mon team!* :star:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "No new meetings today? We can do better than that! Hustle!"
|
||||
}
|
||||
},
|
||||
]
|
||||
}
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(noMeetingText),
|
||||
};
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
Logger.log(sendMsg);
|
||||
Logger.log(respCode);
|
||||
}
|
||||
};
|
||||
Logger.log(sdrMeeting);
|
||||
var toSend = sdrMeeting.splice(1).join('\n');
|
||||
var getEm = toSend.replace(/,/g, ' - ')
|
||||
Logger.log(getEm);
|
||||
let payloadMeetingText =
|
||||
{
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": ":star: *Pitter Patter!* :star:"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "divider"
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "Here's who has meetings today. Get after it boys and girls!"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": getEm
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "image",
|
||||
"image_url": "https://media.giphy.com/media/3ohjURBuAtWDV8d3SE/giphy.gif",
|
||||
"alt_text": "inspiration"
|
||||
}
|
||||
]
|
||||
}
|
||||
//(array[0] + ", you still need to fill out the cells for" + array[2] + " from " + array[1] + "!\n");
|
||||
const webhook = "https://hooks.slack.com/services/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";
|
||||
const options = {
|
||||
method: "post",
|
||||
contentType: "application/json",
|
||||
muteHttpExceptions: true,
|
||||
payload: JSON.stringify(payloadText),
|
||||
};
|
||||
const sendMsg = UrlFetchApp.fetch(webhook, options);
|
||||
var respCode = sendMsg.getResponseCode();
|
||||
Logger.log(sendMsg);
|
||||
Logger.log(respCode);
|
||||
};
|
||||
127
Scripts/_originals/Sheets>Jira.gs
Normal file
127
Scripts/_originals/Sheets>Jira.gs
Normal file
@ -0,0 +1,127 @@
|
||||
/* Pertinent Information and Codes:
|
||||
Custom Fields:
|
||||
Channel = customfield_10121
|
||||
Campaign = customfield_10120
|
||||
SDR = customfield_10122
|
||||
Start Date = customfield_10015
|
||||
|
||||
Users:
|
||||
Travis Nardin = 5d9cb42c0265ca0db955b965
|
||||
Dan Peski = 603318815ddf020069969cad
|
||||
Norm Rasmussen = 6092af20d353800068863d15
|
||||
Michael Valido = 61fbf60cd8d7cf006a90941c
|
||||
Jon Newfield = 6092af212c2f6c0068ec92c4
|
||||
Isabel Katz = 620145241fec260068c107e5
|
||||
Charles McGovern = 5eaaf1c4021ae30ba8fcb184
|
||||
Nick Zuppe = 60eddda64257a90070aeebef
|
||||
Doug Goldsmith = 61294a4845f753006951a590
|
||||
Nick Appleby = 6183eab7892c420072f9c437
|
||||
Quba Williams-Wilfong = 62101fe4e41f76006a6f6510
|
||||
|
||||
Without accounts: Adan, Drew
|
||||
|
||||
*/
|
||||
var count = 0;
|
||||
var list;
|
||||
var finalEntry;
|
||||
|
||||
function myFunction() {
|
||||
var URL = "https://northpass.atlassian.net/rest/api/3/issue/";
|
||||
// var accountID = "6092af20d353800068863d15";
|
||||
var token = "2NrKYv22TLWnxTo7EhU3633E";
|
||||
// var UserCredentials = Utilities.base64Encode(accountID + ":" + token);
|
||||
var user = "nrasmussen@northpass.com";
|
||||
// var pass = "c9QK\>4^fxiHt!";
|
||||
var UserCredentials = Utilities.base64Encode(user + ":" + token);
|
||||
|
||||
// Setting up data range and empty arrays
|
||||
const sheet = SpreadsheetApp.getActiveSheet();
|
||||
var startRow = 1; // First col of data to process
|
||||
var numRows = 1132; // Number of rows to process
|
||||
var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()).getValues();
|
||||
|
||||
for (col in dataRange) { // For a data col within the entire data range
|
||||
var col = dataRange[col];
|
||||
let sdr = col[0]; // Column - A
|
||||
let name = col[1]; // Column - B
|
||||
let rawDate = Utilities.formatDate(col[3], 'America/New_York', 'yyyy-MM-dd');
|
||||
let bookingDate = Utilities.formatDate(col[2], 'America/New_York', 'MM/dd/yyyy'); // Column - C
|
||||
let meetingDate = Utilities.formatDate(col[3], 'America/New_York', 'MM/dd/yyyy'); // Column - D
|
||||
let company = col[4]; // Column - E
|
||||
let channel = col[5]; // Column - F
|
||||
let result = col[7]; // Column - H
|
||||
let campaign = col[8]; // Column - I
|
||||
let info = col[9]; // Column - J
|
||||
let list = [sdr, name, rawDate ,bookingDate, meetingDate, company, channel, result, campaign, info];
|
||||
list.toString();
|
||||
let sdrDict = {
|
||||
"Mike" :
|
||||
"61fbf60cd8d7cf006a90941c",
|
||||
"Nick" :
|
||||
"60eddda64257a90070aeebef",
|
||||
"Appleby" :
|
||||
"6183eab7892c420072f9c437",
|
||||
"Doug" :
|
||||
"61294a4845f753006951a590",
|
||||
"Quba" :
|
||||
"62101fe4e41f76006a6f6510",
|
||||
};
|
||||
if (list.includes("Unqork")) {
|
||||
var data = {
|
||||
"fields": {
|
||||
"project": {
|
||||
"key": "NPIPE",
|
||||
},
|
||||
"issuetype": {
|
||||
"id": "10071",
|
||||
},
|
||||
"summary": list[5],
|
||||
"description": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Booked Date - " + list[3] + '\n' +
|
||||
"Meeting Date - " + list[4] + '\n' +
|
||||
"Description from Tracker: " + list[9] + '\n' +
|
||||
"Last Status - " + list[7]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
"customfield_10015": list[2], // Start (Meeting) Date - rawDate
|
||||
"customfield_10127": [ // Campaign
|
||||
list[8]
|
||||
],
|
||||
"customfield_10129": [{"id" : sdrDict[list[0]]}], // SDR
|
||||
"customfield_10128": [ // Channel
|
||||
list[6]
|
||||
],
|
||||
}
|
||||
},
|
||||
payload = JSON.stringify(data);
|
||||
Logger.log(payload);
|
||||
var headers = {
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Basic " + UserCredentials,
|
||||
"muteHttpExceptions": true,
|
||||
}
|
||||
var options = {
|
||||
"method": "POST",
|
||||
"headers": headers,
|
||||
"payload": payload
|
||||
}
|
||||
//Logger.log(options);
|
||||
var response = UrlFetchApp.fetch(URL, options);
|
||||
//Logger.log(response);
|
||||
var respCode = response.getResponseCode();
|
||||
//Logger.log(respCode);
|
||||
}
|
||||
}
|
||||
};
|
||||
47
Scripts/_originals/WCAWebhooks.gs
Normal file
47
Scripts/_originals/WCAWebhooks.gs
Normal file
@ -0,0 +1,47 @@
|
||||
function doGet(e) {
|
||||
return HtmlService.createHtmlOutput("get request received");
|
||||
}
|
||||
|
||||
//this is a function that fires when the webapp receives a POST request
|
||||
function doPost(e) {
|
||||
var params = JSON.stringify(e.postData.contents);
|
||||
params = JSON.parse(params);
|
||||
var now = new Date();
|
||||
var timeAdded = Utilities.formatDate(now,'America/New_York','MM/dd/yyyy');
|
||||
|
||||
var learnerName = params.substring(params.indexOf('{"name":"') + 7, params.lastIndexOf('"email"'));
|
||||
learnerName = learnerName.slice(learnerName.indexOf('"') + 1, learnerName.lastIndexOf('"'),);
|
||||
Logger.log("Name = " + learnerName);
|
||||
|
||||
var learnerEmail = params.substring(params.indexOf('"email":"') + 9, params.lastIndexOf('"full_name"'));
|
||||
learnerEmail = learnerEmail.slice(learnerName.indexOf('"') + 1, learnerEmail.lastIndexOf('"'),);
|
||||
Logger.log("Email = " + learnerEmail);
|
||||
|
||||
var courseName = params.substring(params.indexOf('"course_name":"') + 4, params.lastIndexOf('"attributes"'));
|
||||
courseName = courseName.slice(courseName.indexOf('"') + 3, courseName.lastIndexOf('"'),);
|
||||
Logger.log("Course = " + courseName);
|
||||
|
||||
var activityName = params.substring(params.indexOf('"title":"') + 4, params.lastIndexOf('"course_name"'));
|
||||
activityName = activityName.slice(activityName.indexOf('"') + 3, activityName.lastIndexOf('"'),);
|
||||
Logger.log("Activity = " + activityName);
|
||||
|
||||
var dateCompleted = params.substring(params.indexOf('"updated_at":"') + 4, params.lastIndexOf('"activated_at"'));
|
||||
dateCompleted = dateCompleted.slice(dateCompleted.indexOf('"') + 3, dateCompleted.lastIndexOf('"'),);
|
||||
Logger.log("Completed on = " + dateCompleted);
|
||||
|
||||
var sheet = SpreadsheetApp.getActiveSheet();
|
||||
var lastRow = Math.max(sheet.getLastRow(),1);
|
||||
|
||||
sheet.insertRowAfter(lastRow);
|
||||
sheet.getRange(lastRow + 1, 1).setValue(timeAdded);
|
||||
sheet.getRange(lastRow + 1, 2).setValue(params);
|
||||
sheet.getRange(lastRow + 1, 3).setValue(learnerName);
|
||||
sheet.getRange(lastRow + 1, 4).setValue(learnerEmail);
|
||||
sheet.getRange(lastRow + 1, 5).setValue(courseName);
|
||||
sheet.getRange(lastRow + 1, 6).setValue(activityName);
|
||||
sheet.getRange(lastRow + 1, 7).setValue(dateCompleted);
|
||||
|
||||
|
||||
SpreadsheetApp.flush();
|
||||
return HtmlService.createHtmlOutput("post request received");
|
||||
}
|
||||
39
Scripts/confluence_api_example.py
Normal file
39
Scripts/confluence_api_example.py
Normal file
@ -0,0 +1,39 @@
|
||||
# This code sample uses the 'requests' library:
|
||||
# http://docs.python-requests.org
|
||||
import requests
|
||||
from requests.auth import HTTPBasicAuth
|
||||
import json
|
||||
|
||||
url = "https://northpass.atlassian.net/wiki/rest/api/content"
|
||||
|
||||
#auth = HTTPBasicAuth("bnJhc211c3NlbkBub3J0aHBhc3MuY29tOnFmOUlsN1g0d2t0aGdRS0JPSWx5NTczNw==")
|
||||
auth = HTTPBasicAuth("nrasmussen@northpass.com", "qf9Il7X4wkthgQKBOIly5737")
|
||||
|
||||
headers = {
|
||||
"X-Atlassian-Token": "no-check",
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
payload = json.dumps( {
|
||||
"type":"page",
|
||||
"title":"Test Expandable Page",
|
||||
"ancestors":[{"id":2210463745}],
|
||||
"space":
|
||||
{"key":"~350535240"},
|
||||
"body":
|
||||
{"storage":
|
||||
{"value":
|
||||
"<p>This is a new page</p> <ac:structured-macro ac:name='expand' ac:schema-version='1'><ac:rich-text-body><p>expandable content goes here</p></ac:rich-text-body></ac:structured-macro>",
|
||||
"representation":"storage"}}
|
||||
} )
|
||||
|
||||
response = requests.request(
|
||||
"POST",
|
||||
url,
|
||||
data=payload,
|
||||
headers=headers,
|
||||
auth=auth
|
||||
)
|
||||
|
||||
print(json.dumps(json.loads(response.text), sort_keys=True, indent=4, separators=(",", ": ")))
|
||||
Reference in New Issue
Block a user