Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8691

Google Spread Sheet API v4を使ってToDoのCRUD操作を行ったメモ

$
0
0

概要

前回では、Spread Sheetを操作できる環境を作った。
次は、CRUD操作を試してみる。

基本的にはapi v4 リファレンスsamplesの通り。
SQLでいうWHEREをうまくやる方法が見つからなかったので、行番号を出力して使用するようにした。
絞り込みはフィルターを作成して、取得すればできそうな気もしますが面倒そうで、スプレッドシート側でやることに。
簡単に条件を付ける方法ご存じの方いらっしゃれば教えてください。

ソース
スプレッドシート

スプレッドシート

基本の情報シート

A1セルに=ARRAYFORMULA(if(B:B="","",row(B:B)-1))を入れて、行番号が出力されるようにしている。
image.pngimage.png

絞り込みシート

A1セルに=query(Todo!A:D,"select * where D <> TRUE", 1)を入れて、絞り込んだ結果を表示するようにしている。
プログラムからは、このシートを参照するだけ。
image.png

プログラム

認証

constprivate_key=process.env.SERVICE_ACCOUNT_PRIVATE_KEY.replace('\\\\','\\',)asyncfunctiongetAuth(){constauth=awaitgoogle.auth.getClient({credentials:{client_email:process.env.SERVICE_ACCOUNT_CLIENT_EMAIL,private_key,},scopes:['https://www.googleapis.com/auth/spreadsheets'],})returnauth}

CREATE

create:async(todo)=>{constauth=awaitgetAuth()constreq={auth,spreadsheetId:spreadsheetId,range:'A1',valueInputOption:'USER_ENTERED',insertDataOption:'INSERT_ROWS',resource:{values:[['',...values(todo)]],},}awaitsheets.spreadsheets.values.append(req)},

READ

  • 全件取得
asyncfunctionfetchAll(spreadsheetId:string,range:string){constbaseSheetName='Todo'constauth=awaitgetAuth()constapiOptions={auth,spreadsheetId,range:`${baseSheetName}!${range}`,}constres=awaitsheets.spreadsheets.values.get(apiOptions)if(!res.data||!res.data.values)return[]returnres.data.values}
  • 絞り込み(そんなに行が多くなる想定がないのでとりあえず100件で十分としている)
asyncfunctionfetchCompleted(isCompleted){constcompletedSheetName='TodoCompleted'constuncompletedSheetName='TodoUncompleted'constsheetName=isCompleted?completedSheetName:uncompletedSheetNameconstauth=awaitgetAuth()constapiOptions={auth,spreadsheetId,range:`${sheetName}!A2D100`,}constres=awaitsheets.spreadsheets.values.get(apiOptions)if(!res.data.values)return[]// console.log('fetchres', res.data)returnres.data.values}
  • 指定行を1行取得
asyncfunctionfetch(rowNumber):Promise<null|string[]>{constauth=awaitgetAuth()constrequest={spreadsheetId,resource:{dataFilters:[{gridRange:{sheetId:baseSheetId,startRowIndex:rowNumber,endRowIndex:rowNumber+1,},},],},auth,}try{constresponse=(awaitsheets.spreadsheets.values.batchGetByDataFilter(request)).dataif(!response.valueRanges||response.valueRanges.length===0)returnnullreturnresponse.valueRanges[0].valueRange.values[0]}catch(err){console.error(err)returnnull}}

UPDATE

update:async(rowNumber,update)=>{constauth=awaitgetAuth()constarr=awaitfetch(rowNumber)if(!arr)returnnullconsttodo=convertSheetArrayToToDo(arr)constupdatedTodo={...todo,...update}const[_,...updateValues]=values(updatedTodo)constrequest={spreadsheetId,resource:{valueInputOption:'USER_ENTERED',data:[{dataFilter:{gridRange:{sheetId:0,startRowIndex:rowNumber,endRowIndex:rowNumber+1,startColumnIndex:1,endColumnIndex:4,},},values:[updateValues],majorDimension:'ROWS',},],},auth,}try{constresponse=(awaitsheets.spreadsheets.values.batchUpdateByDataFilter(request)).dataif(response.totalUpdatedRows!==1)returnnull}catch(err){console.error(err)}returnupdatedTodo}

DELETE

  • 指定行を削除
asyncfunctionremove(rowNumber:number){constauth=awaitgetAuth()constreq={auth,spreadsheetId:spreadsheetId,resource:{requests:[{deleteDimension:{range:{sheetId:baseSheetId,dimension:'ROWS',startIndex:rowNumber,endIndex:rowNumber+1,},},},],},}awaitsheets.spreadsheets.batchUpdate(req)returnstart}

型定義

exporttypeID=stringexportinterfaceTodo{rowNumber:numberid:IDtitle:stringcompleted:boolean}exporttypeOptionalKeys<T>={[KinkeyofT]?:T[K]|null}exportinterfaceDataStorage<Textends{rowNumber:number}>{fetchAll:()=>Promise<T[]>fetchByCompleted:(completed:boolean)=>Promise<T[]>create:(todo:Omit<T,'rowNumber'>)=>Promise<void>update:(rowNumber:number,update:OptionalKeys<T>)=>Promise<T|null>remove:(rowNumber:number)=>Promise<number|null>}

参考

Googleスプレッドシートをプログラムから操作
NOWでデプロイできるGoogleフォームみたいに追記できるAPIを作ったので、GitHubに公開してみた


Viewing all articles
Browse latest Browse all 8691

Trending Articles