Node.jsでGoogle Drive APIを利用する

概要

Node.jsでGoogle Drive APIを利用する方法を記述します。

事前準備

  • Google Cloud Platformでプロジェクトを作成する
  • Google Drive APIを利用できるように設定する
  • サービスアカウントを作成して、認証情報をjson形式でダウンロードする

実装

  • ライブラリのインストール
$ npm install googleapis
  • 認証
const { google } = require('googleapis')

const auth = new google.auth.GoogleAuth({
  keyFile: './credentials.json', // 事前準備でダウンロードしたjson形式の認証情報ファイル
  scopes: [
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/drive.file'
  ]
})

const drive = google.drive({
  version: 'v3',
  auth
})
  • ファイルの一覧を取得
const res = await drive.files.list({
  pageSize: 100,
  fields: 'nextPageToken, files(id, name)'
})
const files = res.data.files
if (files.length) {
  console.log('Files: ')
  files.map((file) => {
    console.log(`${file.name} (${file.id})`)
  }
}
  • ファイルのアップロード
const path = require('path')
const fs = require('fs')

//npm install file-type
const fileType = require('file-type')

const ft = await fileType.fromFile('path/to/file')
const res = await drive.files.create({
  requestBody: {
    name: path.basename('path/to/file'),
    mimeType: ft.mime
  },
  media: {
    mimeType: ft.mime,
    body: fs.createReadStream('path/to/file')
  }
})
const data = res.data
console.log('uploadFile: ', { data })
// uploadFile:  {
//   data: {
//     kind: 'drive#file',
//     id: 'xxxxxxxxxx',
//     name: 'xxxxx',
//     mimeType: 'xxxxx/xxx'
//  }
// }
  • ファイルの共有
const res = await drive.permissions.create({
  resource: {
    type: 'user',
    role: 'writer',
    emailAddress: 'xxx@xxxxx'
  },
  fileId: 'file id',
  fields: 'id'
})
const data = res.data
console.log('shareFile: ', { data })
// shareFile:  {
//   data: {
//     id: 'xxxxx'
//   }
// }
const res = await drive.files.create({
  resource: {
    name: 'directory name',
    mimeType: 'application/vnd.google-apps.folder'
  },
  filed: 'id'
})
const data = res.data
console.log('createDirecotry: ', { data })
// createDirectory:  {
//   data: {
//     kind: 'drive#file',
//     id: 'xxxxxxxxxx',
//     name: 'directory name',
//     mimeType: 'application/vnd.google-apps.folder'
//   }
// }
const ft = await fileType.fromFile('path/to/file')
const res = await drive.files.create({
  resource: {
    name: path.basename('path/to/file'),
    parents: ['directory id']
  },
  media: {
    mimeType: ft.mime,
    body: fs.createReadStream('path/to/file')
  },
  fields: 'id'
})
const data = res.data
console.log('uploadFileInDirectory: ', { data })
// uploadFileInDirectory:  {
//   data: {
//     id: 'xxxxxxxxxx'
//   }
// }
  • ファイルの削除
const res = await drive.files.delete({
  fileId: 'file id'
})
const status = res.status
console.log('deleteFile: ', { status })
// deleteFile:  { status: 204 }

備考