Merge pull request #10777 from Budibase/fix/google-sheets-issues
Fix/google sheets issues
This commit is contained in:
commit
93191a17b5
|
@ -457,22 +457,41 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
||||||
}) {
|
}) {
|
||||||
try {
|
try {
|
||||||
await this.connect()
|
await this.connect()
|
||||||
|
const hasFilters = dataFilters.hasFilters(query.filters)
|
||||||
|
const limit = query.paginate?.limit || 100
|
||||||
|
const page: number =
|
||||||
|
typeof query.paginate?.page === "number"
|
||||||
|
? query.paginate.page
|
||||||
|
: parseInt(query.paginate?.page || "1")
|
||||||
|
const offset = (page - 1) * limit
|
||||||
const sheet = this.client.sheetsByTitle[query.sheet]
|
const sheet = this.client.sheetsByTitle[query.sheet]
|
||||||
let rows: GoogleSpreadsheetRow[] = []
|
let rows: GoogleSpreadsheetRow[] = []
|
||||||
if (query.paginate) {
|
if (query.paginate && !hasFilters) {
|
||||||
const limit = query.paginate.limit || 100
|
|
||||||
let page: number =
|
|
||||||
typeof query.paginate.page === "number"
|
|
||||||
? query.paginate.page
|
|
||||||
: parseInt(query.paginate.page || "1")
|
|
||||||
rows = await sheet.getRows({
|
rows = await sheet.getRows({
|
||||||
limit,
|
limit,
|
||||||
offset: (page - 1) * limit,
|
offset,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
rows = await sheet.getRows()
|
rows = await sheet.getRows()
|
||||||
}
|
}
|
||||||
const filtered = dataFilters.runLuceneQuery(rows, query.filters)
|
// this is a special case - need to handle the _id, it doesn't exist
|
||||||
|
// we cannot edit the returned structure from google, it does not have
|
||||||
|
// setter functions and is immutable, easier to update the filters
|
||||||
|
// to look for the _rowNumber property rather than rowNumber
|
||||||
|
if (query.filters?.equal) {
|
||||||
|
const idFilterKeys = Object.keys(query.filters.equal).filter(filter =>
|
||||||
|
filter.includes(GOOGLE_SHEETS_PRIMARY_KEY)
|
||||||
|
)
|
||||||
|
for (let idFilterKey of idFilterKeys) {
|
||||||
|
const id = query.filters.equal[idFilterKey]
|
||||||
|
delete query.filters.equal[idFilterKey]
|
||||||
|
query.filters.equal[`_${GOOGLE_SHEETS_PRIMARY_KEY}`] = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let filtered = dataFilters.runLuceneQuery(rows, query.filters)
|
||||||
|
if (hasFilters && query.paginate) {
|
||||||
|
filtered = filtered.slice(offset, offset + limit)
|
||||||
|
}
|
||||||
const headerValues = sheet.headerValues
|
const headerValues = sheet.headerValues
|
||||||
let response = []
|
let response = []
|
||||||
for (let row of filtered) {
|
for (let row of filtered) {
|
||||||
|
@ -535,7 +554,12 @@ class GoogleSheetsIntegration implements DatasourcePlus {
|
||||||
const row = rows[query.rowIndex]
|
const row = rows[query.rowIndex]
|
||||||
if (row) {
|
if (row) {
|
||||||
await row.delete()
|
await row.delete()
|
||||||
return [{ deleted: query.rowIndex }]
|
return [
|
||||||
|
{
|
||||||
|
deleted: query.rowIndex,
|
||||||
|
[GOOGLE_SHEETS_PRIMARY_KEY]: query.rowIndex,
|
||||||
|
},
|
||||||
|
]
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Row does not exist.")
|
throw new Error("Row does not exist.")
|
||||||
}
|
}
|
||||||
|
|
|
@ -455,3 +455,19 @@ export const luceneLimit = (docs: any[], limit: string) => {
|
||||||
}
|
}
|
||||||
return docs.slice(0, numLimit)
|
return docs.slice(0, numLimit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const hasFilters = (query?: Query) => {
|
||||||
|
if (!query) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
const skipped = ["allOr"]
|
||||||
|
for (let [key, value] of Object.entries(query)) {
|
||||||
|
if (skipped.includes(key) || typeof value !== "object") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (Object.keys(value).length !== 0) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue