-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
137 lines (107 loc) · 2.78 KB
/
index.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
var Writable = require('stream').Writable
var GoogleSpreadsheet = require('google-spreadsheet')
var inherits = require('inherits')
/**
* Filter the worksheet(s) with the required title
*
* @param {Worksheet} element
*/
function filterWorksheet(element)
{
return element.title == this
}
/**
* Store data on a spreadsheet appending new rows
*
* @param {string} spreadsheetKey - the long id in the sheets URL
* @param {Object|string} creds
* @param {string} creds.client_email
* @param {string} creds.private_key
* @param {Object} [options]
* @param {Integer} [options.worksheet=0]
*
* @emits {WorksheetLog#Error} error
*/
function WorksheetLog(spreadsheetKey, creds, options)
{
if(!(this instanceof WorksheetLog))
return new WorksheetLog(spreadsheetKey, creds, options)
var self = this
if(spreadsheetKey.constructor.name === 'Object')
{
creds = spreadsheetKey.creds
options = spreadsheetKey.options
spreadsheetKey = spreadsheetKey.spreadsheetKey
}
options = options || {}
options.objectMode = true
WorksheetLog.super_.call(this, options)
// Buffer data until we are ready
this.cork()
var worksheet = options.worksheet || 0
var sheet = new GoogleSpreadsheet(spreadsheetKey)
/**
* Emit the error and close the stream
*
* @param {Error} error
*/
function onError(error)
{
self.emit('error', error)
self.end()
}
/**
* Get the worksheet by its title or position
*/
function getWorksheet()
{
sheet.getInfo(function(error, info)
{
if(error) return onError(error)
// Get the worksheet
var worksheets = info.worksheets
worksheet = worksheets.filter(filterWorksheet, worksheet)[0]
|| worksheets[worksheet]
// Start writting all the (buffered) data
self.uncork()
})
}
// Authenticate user
sheet.useServiceAccountAuth(creds, function(err, token)
{
if(err) return onError(err)
// Worksheet already selected by its ID
if(typeof worksheet === 'number') return getWorksheet()
// Create a new worksheet by its title if it don't exists yet and get its ID
var opts =
{
title: worksheet,
rowCount: 1,
colCount: 1
}
sheet.addWorksheet(opts, function(error, info)
{
// [ToDo] Ignore errors related to existing worksheet and notify others
getWorksheet()
})
})
/**
* Write a streamed row on the worksheet
*
* @param {Object} row
* @param {*} _ - ignored
* @param {Function} callback
*
* @private
*/
this._write = function(row, _, callback)
{
worksheet.addColnames(Object.keys(row), function(error)
{
if(error) return onError(error)
worksheet.addRow(row, callback)
})
}
}
inherits(WorksheetLog, Writable)
module.exports = WorksheetLog