├── BigQuery
├── README.md
└── webhook
│ ├── README.md
│ └── code.gs
├── Classroom
├── README.md
└── Record Attendance
│ └── Code.gs
├── Firebase
├── Authentication
│ ├── Index.html
│ └── code.gs
├── Dynamic Links
│ └── newLink
│ │ └── urlShortenerFB.gs
└── README.md
├── Ghost
├── README.md
└── Subscribers
│ ├── README.md
│ └── code.gs
├── Gmail
├── Gmail API
│ └── Code.gs
└── README.md
├── Google Chat
├── Chat App
│ ├── README.md
│ └── Twitter
│ │ ├── App.gs
│ │ ├── Cards.gs
│ │ ├── Code.gs
│ │ ├── README.md
│ │ ├── Twitter.gs
│ │ └── appsscript.json
└── README.md
├── Hangouts Chat
├── Bot
│ ├── README.md
│ └── getThreadID.gs
└── README.md
├── LICENSE
├── Library
├── Exotel
│ ├── ExoAPI.gs
│ ├── README.md
│ └── sample
│ │ ├── callDetails.gs
│ │ └── connect2Num.gs
└── README.md
├── Login Dashboard
├── Dashboard.html
├── Login.html
├── README.md
└── code.gs
├── Materialize CSS
├── Autocomplete
│ ├── Code.gs
│ ├── Index.html
│ └── README.md
└── README.md
├── Meeting Reminder
└── Code.gs
├── Metrics (GAS)
├── Code.gs
├── README.md
├── appscript.json
└── md5.gs
├── README.md
├── Random
├── Employee certificate
│ └── code.gs
├── Icons
│ ├── ACCEPTED.png
│ ├── AUDIO.png
│ ├── CANCELLED.png
│ ├── CHAT.png
│ ├── DRAFT.png
│ ├── DRAWING.png
│ ├── FILE.png
│ ├── FOLDER.png
│ ├── IMAGE.png
│ ├── IMPORTANT.png
│ ├── INBOX.png
│ ├── README.md
│ ├── SCRIPT.png
│ ├── SELF.png
│ ├── SENT.png
│ ├── SHARED.png
│ ├── SITES.png
│ ├── SPAM.png
│ ├── STARRED.png
│ ├── TENTATIVE.png
│ ├── TRASH.png
│ ├── TWITTER.png
│ ├── UNREAD.png
│ └── VIDEO.png
├── Meetings Heatmap
│ ├── Chart.html
│ ├── Index.html
│ ├── Processing.html
│ ├── README.md
│ └── code.gs
├── NewMonthNewSheet.gs
├── README.md
└── Revue <> Ghost
│ ├── Config.gs
│ ├── Ghost.gs
│ └── Revue.gs
├── Real-time Dashboard
├── Index.html
├── README.md
└── code.gs
├── Rebrandly
├── README.md
└── newLink
│ └── urlShortenerRB.gs
├── Sheets
├── Custom Functions
│ └── GET_REDIRECT_LOCATION.gs
├── Find Precedents
│ └── Code.gs
├── JsDoc2JSON
│ └── Code.gs
├── Project BoldX
│ ├── Code.gs
│ └── Index.html
├── README.md
└── Webhooks
│ ├── GET.gs
│ ├── POST.gs
│ └── appsscript.json
├── Twilio
├── Authy
│ ├── Code.gs
│ ├── Dashboard.html
│ ├── Index.html
│ └── README.md
└── README.md
└── Workspace Add-on
└── More than 100 widgets
├── Data.gs
├── UI.gs
└── appsscript.json
/BigQuery/README.md:
--------------------------------------------------------------------------------
1 | # Connecting Apps Script to [BigQuery](https://cloud.google.com/bigquery/)
2 |
3 | - [webhook](webhook/): This script uses a doGet() function as a webhook to capture data and store it in your BigQuery table
4 |
--------------------------------------------------------------------------------
/BigQuery/webhook/README.md:
--------------------------------------------------------------------------------
1 | # Store data directly on BigQuery using Apps Script
2 |
3 | The [official reference guide](https://developers.google.com/apps-script/advanced/bigquery) doesn't talk of this but the following gave me a hard time to crack down
4 |
5 | ```javascript
6 | 'useLegacySql': false
7 | ```
8 |
--------------------------------------------------------------------------------
/BigQuery/webhook/code.gs:
--------------------------------------------------------------------------------
1 | var projectId = 'XXXXXXXX';
2 | var datasetId = 'YYYYYYYYY';
3 | var tableId = 'ZZZZZZZZ';
4 |
5 | function doGet(e) {
6 | var params = JSON.stringify(e.parameters);
7 | var jsonMapping = JSON.parse(params)
8 | var param1 = jsonMapping["param1"][0]
9 | var param2 = jsonMapping["param2"][0]
10 | var request = {
11 | 'query': "INSERT INTO `" + projectId + "."+ datasetId + "." + tableId + "` VALUES ('" + param1 + "','" + param2 + "')",
12 | 'useLegacySql': false
13 | }
14 | var queryResults = BigQuery.Jobs.query(request, projectId);
15 | var jobId = queryResults.jobReference.jobId;
16 | return ContentService.createTextOutput('Successful')
17 | }
18 |
--------------------------------------------------------------------------------
/Classroom/README.md:
--------------------------------------------------------------------------------
1 | # Connecting Apps Script to [Google Classroom](https://edu.google.com/products/classroom/)
2 |
--------------------------------------------------------------------------------
/Classroom/Record Attendance/Code.gs:
--------------------------------------------------------------------------------
1 | var courseId = 'XXXXXXXXXXXX'; // https://developers.google.com/classroom/reference/rest/v1/courses/list
2 | var topicID = 'YYYYYYYYYYY'; // https://developers.google.com/classroom/reference/rest/v1/courses.topics/list
3 |
4 | var startDate = new Date(); // new Date("dd-MMM-yyyy")
5 | var scheduleForDays = 5; // Number of days to schedule the attendace from 'startDate'
6 |
7 | var scheduledTimeHour = 9; // the number 9 (integer value) for 9 AM
8 | var scheduledTimeMinutes = 0; // the number 0 (integer value) for exactly at the 'scheduledTimeHour'
9 | var dueByHour = 15; // 24-hour; the number 15 (integer value) for 3 PM
10 | var dueByMinutes = 30; // the number 30 (integer value) for the 30th minute from 'dueByHour'
11 |
12 | function scheduleAttendance() {
13 | var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
14 | var questionDate = startDate;
15 | for (var i = 0; i < scheduleForDays; i++) {
16 | var newDate = new Date(questionDate.getTime() + MILLIS_PER_DAY);
17 | createQuestion(questionDate);
18 | questionDate = newDate;
19 | }
20 | }
21 |
22 | function createQuestion(date) {
23 | var title = "Attendance for " + Utilities.formatDate(date, Session.getScriptTimeZone(), "dd-MMMM-yyyy");
24 | var scheduledTime = Utilities.formatDate(new Date(date.getFullYear(), date.getMonth(), date.getDate(), scheduledTimeHour, scheduledTimeMinutes, 0), "UTC", "yyyy-MM-dd'T'HH:mm:ss'Z'");
25 | var dueByTime = Utilities.formatDate(new Date(date.getFullYear(), date.getMonth(), date.getDate(), dueByHour, dueByMinutes, 0), "UTC", "yyyy-MM-dd HH:mm:ss");
26 | var payload = {
27 | "workType": "MULTIPLE_CHOICE_QUESTION",
28 | "multipleChoiceQuestion": {
29 | "choices": [
30 | "Yes"
31 | ]
32 | },
33 | "title": title,
34 | "description": "Are you working online in Google Classroom?",
35 | "scheduledTime": scheduledTime,
36 | "topicId": topicID,
37 | "dueDate": {
38 | "day": date.getDate(),
39 | "month": date.getMonth() + 1,
40 | "year": date.getFullYear()
41 | },
42 | "dueTime": {
43 | "hours": new Date(dueByTime).getHours(),
44 | "minutes": new Date(dueByTime).getMinutes(),
45 | "seconds": 0
46 | }
47 | };
48 | Classroom.Courses.CourseWork.create(payload, courseId); // https://developers.google.com/classroom/reference/rest/v1/courses.courseWork/create
49 | }
50 |
--------------------------------------------------------------------------------
/Firebase/Authentication/Index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
26 |
44 |
69 |
70 |
71 |
72 |
73 |
Firebase and Google Apps Script
Login using your Google account via Firebase Auth
74 |
75 |
80 |
84 |
85 |
96 |
97 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/Firebase/Authentication/code.gs:
--------------------------------------------------------------------------------
1 | function doGet(e) {
2 | return HtmlService.createHtmlOutputFromFile('Index')
3 | .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
4 | .setTitle('FirebaseUI | Firebase Authentication');
5 | }
6 |
7 | function webAppUrl() {
8 | return ScriptApp.getService().getUrl();
9 | }
10 |
--------------------------------------------------------------------------------
/Firebase/Dynamic Links/newLink/urlShortenerFB.gs:
--------------------------------------------------------------------------------
1 | function URLShortener() {
2 | var body = {
3 | "dynamicLinkInfo": {
4 | "domainUriPrefix": "https://example.page.link",
5 | "link": "https://example.com/?utm_source=email&utm_medium=mobile&utm_content=1234567890"
6 | },
7 | "suffix": {
8 | "option": "SHORT"
9 | }
10 | };
11 | var key = 'XXXXXXXXXXXXXXXXXXXXXXX'
12 | var url = "https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key=" + key;
13 | var options = {
14 | 'method': 'POST',
15 | "contentType": "application/json",
16 | 'payload': JSON.stringify(body),
17 | };
18 | var response = UrlFetchApp.fetch(url, options);
19 | var json = response.getContentText();
20 | var data = JSON.parse(json);
21 | var obj = data["shortLink"];
22 | Logger.log(obj)
23 | }
24 |
--------------------------------------------------------------------------------
/Firebase/README.md:
--------------------------------------------------------------------------------
1 | # Connecting Apps Script to [Firebase Dynamic Links](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)
2 |
3 | - [newLink](Dynamic%20Links/newLink/): This script allows you to create a new short link with the help of Firebase Dynamic Links Short Links API
4 |
--------------------------------------------------------------------------------
/Ghost/README.md:
--------------------------------------------------------------------------------
1 | # Connecting Apps Script to [Ghost.org](https://ghost.org/)
2 |
3 | - [Subscribers](Subscribers/code.gs): [How does the Subscribers feature work?](https://ghost.org/faq/enable-subscribers-feature/)
4 |
--------------------------------------------------------------------------------
/Ghost/Subscribers/README.md:
--------------------------------------------------------------------------------
1 | ## Manage email subscriber list on a spreadsheet
2 |
3 | This script handles both - folks who subscribe and unsubscribe.
4 |
5 | An additional identifier is introduced as `state` in the last column where -
6 | - TRUE denotes that its a subscriber
7 | - FALSE denotes that its an unsubscriber
8 |
--------------------------------------------------------------------------------
/Ghost/Subscribers/code.gs:
--------------------------------------------------------------------------------
1 | /**//* ======================================================== *//**/
2 | /**/ /**/
3 | /**/ // Make changes only to this segment /**/
4 | /**/ /**/
5 | /**/ var sheetID = "Enter-Your-Sheet-ID"; /**/
6 | /**/ var timeZone = "IST"; /**/
7 | /**/ /**/
8 | /**//* ======================================================== *//**/
9 |
10 |
11 | /* ==================== DO NOT CHANGE ANYTHING BELOW THIS LINE ======================== */
12 |
13 |
14 | var ss = SpreadsheetApp.openById(sheetID);
15 | var subscribers = "subscribers"
16 | var sheetName;
17 |
18 | function doPost(e) {
19 | if (JSON.parse(e.postData.contents).subscriber.previous.id == undefined) {
20 | return addSubscriber(e)
21 | } else if (JSON.parse(e.postData.contents).subscriber.current.id == undefined) {
22 | return deleteSubscriber(e)
23 | }
24 | }
25 |
26 | function addSubscriber(e) {
27 | var params = JSON.parse(e.postData.contents).subscriber.current
28 | var id = params.id
29 | var email = params.email
30 | var status = params.status
31 | var subscribed_url = params.subscribed_url
32 | var subscribed_referrer = params.subscribed_referrer
33 | var created_at = params.created_at
34 | created_at = Utilities.formatDate(new Date(created_at), timeZone, "dd MMM, yyyy HH:mm:ss");
35 | var updated_at = params.updated_at
36 | updated_at = Utilities.formatDate(new Date(updated_at), timeZone, "dd MMM, yyyy HH:mm:ss");
37 | var name = params.name
38 | var post_id = params.post_id
39 | var unsubscribed_url = params.unsubscribed_url
40 | var unsubscribed_at = params.unsubscribed_at
41 | if (unsubscribed_at == null) {
42 | unsubscribed_at = null
43 | } else {
44 | unsubscribed_at = Utilities.formatDate(new Date(unsubscribed_at), timeZone, "dd MMM, yyyy HH:mm:ss");
45 | }
46 | var state = true
47 | sheetName = subscribers;
48 | var activeSheet = ss.getSheetByName(sheetName);
49 | if (activeSheet == null) {
50 | activeSheet = ss.insertSheet().setName(sheetName);
51 | activeSheet.appendRow (
52 | [
53 | "id",
54 | "email",
55 | "status",
56 | "subscribed_url",
57 | "subscribed_referrer",
58 | "created_at",
59 | "updated_at",
60 | "name",
61 | "post_id",
62 | "unsubscribed_url",
63 | "unsubscribed_at",
64 | "state"
65 | ]
66 | )
67 | activeSheet.setFrozenRows(1)
68 | activeSheet.appendRow (
69 | [
70 | id,
71 | email,
72 | status,
73 | subscribed_url,
74 | subscribed_referrer,
75 | created_at,
76 | updated_at,
77 | name,
78 | post_id,
79 | unsubscribed_url,
80 | unsubscribed_at,
81 | state
82 | ]
83 | )
84 | removeEmptyColumns(sheetName);
85 | ss.deleteSheet(ss.getSheetByName('Sheet1'))
86 | } else {
87 | activeSheet.appendRow (
88 | [
89 | id,
90 | email,
91 | status,
92 | subscribed_url,
93 | subscribed_referrer,
94 | created_at,
95 | updated_at,
96 | name,
97 | post_id,
98 | unsubscribed_url,
99 | unsubscribed_at,
100 | state
101 | ]
102 | )
103 | }
104 | removeDuplicateRows(sheetName)
105 | return ContentService.createTextOutput('"addSubscriber":"Successful"')
106 | }
107 |
108 | function deleteSubscriber(e) {
109 | var params = JSON.parse(e.postData.contents).subscriber.previous
110 | var id = params.id
111 | var email = params.email
112 | var status = params.status
113 | var subscribed_url = params.subscribed_url
114 | var subscribed_referrer = params.subscribed_referrer
115 | var created_at = params.created_at
116 | created_at = Utilities.formatDate(new Date(created_at), timeZone, "dd MMM, yyyy HH:mm:ss");
117 | var updated_at = params.updated_at
118 | updated_at = Utilities.formatDate(new Date(updated_at), timeZone, "dd MMM, yyyy HH:mm:ss");
119 | var name = params.name
120 | var post_id = params.post_id
121 | var unsubscribed_url = params.unsubscribed_url
122 | var unsubscribed_at = params.unsubscribed_at
123 | if (unsubscribed_at == null) {
124 | unsubscribed_at = null
125 | } else {
126 | unsubscribed_at = Utilities.formatDate(new Date(unsubscribed_at), timeZone, "dd MMM, yyyy HH:mm:ss");
127 | }
128 | sheetName = subscribers;
129 | var activeSheet = ss.getSheetByName(sheetName);
130 | if (activeSheet == null) {
131 | activeSheet = ss.insertSheet().setName(sheetName);
132 | activeSheet.appendRow (
133 | [
134 | "id",
135 | "email",
136 | "status",
137 | "subscribed_url",
138 | "subscribed_referrer",
139 | "created_at",
140 | "updated_at",
141 | "name",
142 | "post_id",
143 | "unsubscribed_url",
144 | "unsubscribed_at",
145 | "state"
146 | ]
147 | )
148 | activeSheet.setFrozenRows(1)
149 | var state = false
150 | activeSheet.appendRow (
151 | [
152 | id,
153 | email,
154 | status,
155 | subscribed_url,
156 | subscribed_referrer,
157 | created_at,
158 | updated_at,
159 | name,
160 | post_id,
161 | unsubscribed_url,
162 | unsubscribed_at,
163 | state
164 | ]
165 | )
166 | removeEmptyColumns(sheetName);
167 | ss.deleteSheet(ss.getSheetByName('Sheet1'))
168 | } else {
169 | var values = activeSheet.getDataRange().getValues();
170 | var headers = values[0]
171 | var idIndex = headers.indexOf('id');
172 | var stateIndex = headers.indexOf('state');
173 | var statusIndex = headers.indexOf('status');
174 | var updated_atIndex = headers.indexOf('updated_at');
175 | var unsubscribed_urlIndex = headers.indexOf('unsubscribed_url');
176 | var unsubscribed_atIndex = headers.indexOf('unsubscribed_at');
177 | var sheetRow;
178 | var subscriberID = true
179 | for(var i=0, iLen=values.length; iThis iš suppösed to be in HTML 👩🏽💻