-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCsvApp.gs
169 lines (135 loc) · 4.17 KB
/
CsvApp.gs
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
/**
* CsvApp
*
* Load csv and spreadsheet folders.
*
* @param {Object} config - Options set in main function
* for ease of use.
*/
function CsvApp(config) {
// Import config
this.extend(config);
// Get folders
this.root = new Folder(DriveApp.getRootFolder());
this.testMode ? this.mode = 'test' : this.mode = 'deploy';
this.folders = this.getSubFolders(
['csvs_new', 'csvs_processed', 'csvs_notValid', 'logs', 'spreadsheets'],
['csv2sheet', this.mode]
);
// Restore blank slate for test runs
if (this.testMode) {
this.resetTest();
};
// Special sauce
this.defaultColWidth = 150; // ... sheet needs a lot more formatting
};
CsvApp.prototype = {
/**
* createSpreadsheet
*
* @param {String} name - Spreadsheet specified in metadata.
* @return {Object} spreadsheet - CsvApp spreadsheet object.
*/
createSpreadsheet : function(name) {
// Create Google spreadsheet and instantiate CsvApp Spreadsheet object
var spreadsheet = new Spreadsheet(SpreadsheetApp.create(name));
// Log
Logger.log("New spreadsheet \'%s\' created", name)
// Move file to spreadsheets folder
this.root.moveFile(spreadsheet.file, this.folders.spreadsheets);
return spreadsheet;
},
/**
* getSpreadsheet
*
* @param {String} name - Specified in metadata
* @returns {Object} spreadsheet - CsvApp spreadsheet object
*/
getSpreadsheetByName : function(name) {
// Get spreadsheet files keyed by filename
var spreadsheets = this.folders.spreadsheets.getFiles();
// Return CsvApp spreadsheet object if Google spreadsheet exists
if (spreadsheets[name]) {
var spreadsheet = new Spreadsheet(SpreadsheetApp.open(spreadsheets[name]));
return spreadsheet;
}
// Otherwise ...
return false
},
/**
* getSubFolders
*
* Traverse path (optional) to get Drive folders by name. Note:
* Method does not handle multiple folders with same name and
* DriveApp offers no reliable way to identify current folder!
*
* @param {array} - subfolders - subfolder names, e.g.,
* ['foldername1', 'foldername2' ...]
* @param {array} - path - parent hierarchy, e.g.,
* ['grandparent_foldername', 'parent_foldername']
* @return {object} - folders - CsvApp Folder objects keyed by
* folder name.
*/
getSubFolders : function (subfolders, path) {
if(path) {
// Get first folder in path via DriveApp
var parent = DriveApp.getFoldersByName(path[0]).next();
for (var i=1; i <= path.length; i++) {
// Get intermediate folders in hierarchy
if (i < (path.length)) {
parent = parent.getFoldersByName(path[i]).next();
}
// Get subfolders and instantiate CsvApp folder object
else {
var folders = {};
subfolders.forEach( function(el) {
folders[el] = new Folder(parent.getFoldersByName(el).next());
});
}
}
}
// In the absence of path, just get each subfolder by name
else {
var folders = {};
subfolders.forEach( function(el) {
folders[el] = new Folder(DriveApp.getFoldersByName(el).next());
})
};
return folders
},
/**
* resetAll
*
* Standalone function to remove all files in deploy folders
* and restore intial state in test folders (including removal
* of test logs). Execute from utilities function run_resetAll
*/
resetAll : function() {
// Run before or after resetTest()
// Also delete test logs
this.folders.logs.empty();
// Get deployed subfolders
this.deployFolders = this.getSubFolders(
['csvs_new', 'csvs_processed', 'csvs_notValid', 'logs', 'spreadsheets'],
['csv2sheet', 'deploy']
);
// Delete files in deploy folders
for (var i in this.deployFolders) {
this.deployFolders[i].empty();
}
},
/**
* resetTest
*
* Restore test csvs to initial locations and delete
* generated spreadsheets
*/
resetTest : function() {
Logger.log('Resetting test files.');
// Delete spreadsheets generated by test
this.folders.spreadsheets.empty();
// Restore test csvs to "new" folder
this.folders.csvs_processed.moveFiles(this.folders.csvs_new);
this.folders.csvs_notValid.moveFiles(this.folders.csvs_new);
}
}