イマイチ使いたい形でAPIを提供してくれてないので、GoogleSheetクラスをラップするクラスを書いた。
あるタスクで利用した用途によっているので、今後拡張する必要あり。
class WrappedWorkSheet {
constructor(sheet) {
this.sheet = sheet
this.data = this.sheet.getDataRange().getValues()
this.header = this.data.slice(0,1)[0]
this.body = this.data.slice(1,)
this.latestRow = this.data.slice(-1,)[0]
this.latestRowWithHeader = Object.fromEntries(this.latestRow.map((e, index) => [this.header[index], e]))
this.latestRowPos = this.data.length
}
static build(sheetId, sheetName) {
// TODO: あってるっぽいが要チェック。継承した場合用
const self = this
return new self(SpreadsheetApp.openById(sheetId).getSheetByName(sheetName))
}
getLatestRowWithHeader() {
return this.latestRowWithHeader
}
getLatestRowPos() {
return this.latestRowPos
}
updateWholeRow(rowPos, newValues) {
this.sheet.getRange(rowPos, 1, 1, this.sheet.getLastColumn()).clear({ contentsOnly: true })
this.sheet.getRange(rowPos, 1, 1, this.sheet.getLastColumn()).setValues([newValues])
}
updateValueOfRow(rowPos, label, newValue) {
const colPos = this.findTargetColPosition(label)
this.updateValue(rowPos, colPos, newValue)
}
findTargetRowPosition(label, targetValue) {
const targetColumnPosition = this.findTargetColPosition(label)
if (targetColumnPosition === null) { return null }
const ValuesInTargetColumn = this.getColumnValues(targetColumnPosition)
return this.getPosition(ValuesInTargetColumn, targetValue)
}
findTargetColPosition(headerLabel) {
return this.getPosition(this.header, headerLabel)
}
// basic utility and delegation
updateValue(rowPos, colPos, value) {
this.sheet.getRange(rowPos, colPos).setValue(value)
}
getPosition(values, value) {
const position = values.indexOf(value)
return position == -1 ? null : position + 1
}
getColumnValues(columnPoistion){
return this.sheet.getRange(1, columnPoistion, this.sheet.getLastRow()).getValues().flat()
}
appendRow(row) {
this.sheet.appendRow(row)
}
deleteRow(rowPos) {
this.sheet.deleteRow(rowPos)
}
}