-
Notifications
You must be signed in to change notification settings - Fork 1
/
common.js
191 lines (167 loc) · 5.54 KB
/
common.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
// Common GAS Functions
// v2.4.0 - 2022-02-19
var common = {
// Retrieve file as JSON object
grabJson: function(id)
{
var file = DriveApp.getFileById(id).getAs("application/json");
return JSON.parse(file.getDataAsString());
},
// Write JSON object as string to file
saveJson: function(id, content)
{
var file = DriveApp.getFileById(id);
// Set the file contents
file.setContent(JSON.stringify(content));
},
// Get a ref to given folder, or create one if it doesn't exist
findOrCreateFolder: function(parentDir, foldername)
{
// See if there's already a folder in the indicated Google Drive folder
var backupFolder = DriveApp.getFolderById(parentDir);
var folders = backupFolder.getFoldersByName(foldername);
if (folders.hasNext())
{
return folders.next();
}
else
{
// Create a new folder
Logger.log("Created new folder: " + foldername);
return backupFolder.createFolder(foldername);
}
},
// Find file in folder, and delete it
deleteFile: function(parentDir, filename)
{
// See if the indicated file is in the indicated Google Drive folder
var folder = DriveApp.getFolderById(parentDir);
var files = folder.getFilesByName(filename);
if (files.hasNext())
{
files.next().setTrashed(true);
Logger.log("Deleted file: " + filename);
}
},
// Get a ref to given file, or create one if it doesn't exist
findOrCreateFile: function(parentDir, filename, newContent = "")
{
// See if there's already a file in the indicated Google Drive folder
var folder = DriveApp.getFolderById(parentDir);
var files = folder.getFilesByName(filename);
if (files.hasNext())
{
return files.next();
}
else
{
// Create a new empty file
Logger.log("Created file: " + filename);
return folder.createFile(filename, newContent);
}
},
// Write to file, only if different to existing content
updateOrCreateFile: function(parentDir, filename, content)
{
var file = common.findOrCreateFile(parentDir, filename);
// Check if the contents already matches
if (file.getBlob().getDataAsString() != content)
{
// Set the file contents
file.setContent(content);
Logger.log("Updated file: " + filename);
}
return file;
},
// Write blob to file
updateOrCreateBlobFile: function(parentDir, filename, content)
{
// Start off by deleting any old file with the same name
common.deleteFile(parentDir, filename);
// Create a new file, with the new contents
var folder = DriveApp.getFolderById(parentDir);
var newFile = folder.createFile(content);
newFile.setName(filename);
Logger.log("Updated file: " + filename);
return newFile;
},
// Parse URL path parameters
parsePathParameters: function(request)
{
// If there's only one parameter, just treat it as a path
if (!request.queryString.match(/\=/))
{
return request.queryString;
}
// Look for a parameter called "path"
return request.parameter.path || "";
},
// Strip spaces, no-break spaces, zero-width spaces,
// & zero-width no-break spaces
trim: function(string)
{
var pattern = /(^[\s\u00a0\u200b\uFEFF]+)|([\s\u00a0\u200b\uFEFF]+$)/g;
return string.replace(pattern, "");
},
// Retrieve text from inside XML tags
stripXml: function(input)
{
// Only parse input if it looks like it contains tags
if (input.match(/<[^>]*>/))
{
// Find where the tags start & end
var start = input.indexOf('<');
var end = input.lastIndexOf('>') + 1;
// Grab any text before all XML tags
var pre = input.slice(0, start);
// Grab any text after all XML tags
var post = input.slice(end);
var inside = "";
try
{
// Parse input without any pre or post text
var cleanInput = input.slice(start, end);
var doc = XmlService.parse(cleanInput);
inside = doc.getRootElement().getText();
}
catch (error)
{
Logger.log(input + " = " + error);
}
return pre + inside + post;
}
return input;
},
// Convert a JSON string to a pretty-print JSON string
prettyPrintJsonStr: function(input)
{
return JSON.stringify(JSON.parse(input), null, 4);
},
// Collate objects at given path, from array of JSON strings
collateArrays: function(path, objects)
{
var outArray = [];
var chunks = path.split('.');
// Iterate over each object
for (const resp of objects)
{
var obj = JSON.parse(resp);
for (const chunk of chunks)
{
obj = obj[chunk];
}
outArray = outArray.concat(obj);
}
return outArray;
},
// Covert an array into a map, which can be used for tallying
arrayToCountMap: function(array, defaultCount = 0)
{
var output = new Map();
array.forEach(element =>
{
output.set(element, defaultCount);
});
return output;
},
};