Skip to content

Commit

Permalink
ReadSpreadsheet improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
viroulep committed Apr 14, 2024
1 parent 73535f1 commit 3e230c7
Show file tree
Hide file tree
Showing 3 changed files with 448 additions and 14 deletions.
44 changes: 30 additions & 14 deletions functions/sheets.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { GoogleSpreadsheet } = require('google-spreadsheet')
const { JWT } = require('google-auth-library')

const extension = require('./../extension')

Expand All @@ -14,33 +15,35 @@ class Header {
this.name = suffix[1]
}

parse(val) {
parse(value) {
let val = value || ''
if (this.type == 'number') {
return +val
}
if (this.type == 'list') {
return val.split(', ')
return val.split(',').map(s => s.trim())
}
if (val === null) {
return ''
}
return val
return val.trim()
}

get(row) {
return this.parse(row[this.value])
return this.parse(row.get(this.value))
}

getIdentifier(person) {
return this.parse(person[this.name])
}
}

readSpreadsheetImpl = async function(competition, spreadsheetId) {
readSpreadsheetImpl = async function(competition, spreadsheetId, offset) {
out = { warnings: [], loaded: 0 }
const creds = require('./../google-credentials.json')
const doc = new GoogleSpreadsheet(spreadsheetId)
await doc.useServiceAccountAuth(creds)
const serviceAccountAuth = new JWT({
email: creds.client_email,
key: creds.private_key,
scopes: ['https://www.googleapis.com/auth/spreadsheets.readonly'],
})
const doc = new GoogleSpreadsheet(spreadsheetId, serviceAccountAuth)
await doc.loadInfo()
const sheet = doc.sheetsByIndex[0]
await sheet.loadHeaderRow(1)
Expand All @@ -59,7 +62,7 @@ readSpreadsheetImpl = async function(competition, spreadsheetId) {
})
})

const rows = await sheet.getRows({offset: 1})
const rows = await sheet.getRows({ offset })
rows.forEach((row) => {
// First use the identifiers provided to find the person.
var bestMatch = 0
Expand All @@ -73,10 +76,17 @@ readSpreadsheetImpl = async function(competition, spreadsheetId) {
return
}
var identifierVal = header.get(row)
if (!identifierVal) {
return
}
identifierVal = identifierVal instanceof String ? identifierVal.toUpperCase() : identifierVal

if (firstIdentifier === '') {
firstIdentifier = identifierVal
}
if (header.getIdentifier(person).toUpperCase() === identifierVal.toUpperCase()) {
var personIdentifierVal = header.getIdentifier(person)
personIdentifierVal = personIdentifierVal instanceof String ? personIdentifierVal.toUpperCase() : personIdentifierVal
if (personIdentifierVal === identifierVal) {
matching++
}
})
Expand Down Expand Up @@ -117,12 +127,18 @@ const ReadSpreadsheet = {
name: 'spreadsheetId',
type: 'String',
},
{
name: 'offset',
type: 'Number',
docs: 'Skip the first `offset` rows of the spreadsheet.',
defaultValue: 0,
},
],
outputType: 'ReadSpreadsheetResult',
usesContext: true,
mutations: ['persons'],
implementation: (ctx, spreadsheetId) => {
return readSpreadsheetImpl(ctx.competition, spreadsheetId)
implementation: (ctx, spreadsheetId, offset) => {
return readSpreadsheetImpl(ctx.competition, spreadsheetId, offset)
}
}

Expand Down
Loading

0 comments on commit 3e230c7

Please sign in to comment.