GASでcreateFolderやcreateFileをそのまま使うと同名のファイルができてしまう

GASのフォルダやファイルの作成

Google Apps Script (以下GAS) でフォルダやファイルを作成するにはcreateFolderやcreateFileを使用するのだが、ターミナルのmkdirtouchのようにそのまま使用してはいけない。

同名のフォルダやファイルが作成される

ターミナルでmkdirやtouchを使用しても同じフォルダ内に同名のフォルダやファイルが作成されることはない。

mkdir foo
touch bar.txt

しかし、GASのcreateFolderやcreateFileは同じフォルダ内に同名のフォルダやファイルが作成可能なので、そのままだと同名のフォルダやファイルが作成されてしまう。

function myFunction() {
  const driveFolderId = 'google_drive_folder_id'
  const folder = DriveApp.getFolderById(driveFolderId)
  folder.createFolder('foo')
  folder.createFile('bar.txt', 'Hello world!')
}
GASでcreateFolderやcreateFileをそのまま使うと同名のファイルができてしまう

すでにフォルダやファイルがあるか判定する

同じフォルダ内に同名のフォルダやファイルが作成されないようにするには同名のフォルダやファイルが存在しているか判定して存在していないときのみcreateFolderやcreateFileで作成するようにすれば良い。

やり方はgetFoldersやgetFilesでフォルダやファイルの一覧を取得して、whileで一覧に同名のフォルダ(ファイル)があるか調べる。

存在する場合はhasFolderName(hasFileName)をtrueにしてbreakしたあと条件分岐で作成するよう処理すれば良い。

function createFolder() {
  const folder = DriveApp.getRootFolder()
  const folders = folder.getFolders()
  const folderName = 'foo'
  let hasFolderName = false
  while (folders.hasNext()) {
    const folder = folders.next()
    if (folder.getName() === folderName) {
      hasFolderName = true
      console.log(`${folderName}フォルダが存在します。`)
      break
    }
  }
  if (!hasFolderName) {
    folder.createFolder(folderName)
    console.log(`${folderName}フォルダがないので作成しました。`)
  }
}

function createFiles() {
  const folder = DriveApp.getRootFolder()
  const files = folder.getFiles()
  const fileName = 'foo.txt'
  let hasFileName = false
  while (files.hasNext()) {
    const file = files.next()
    if (file.getName() === fileName) {
      hasFileName = true
      console.log(`${fileName}ファイルが存在します。`)
      break
    }
  }
  if (!hasFileName) {
    folder.createFile('foo.txt', 'Hello world!')
    console.log(`${fileName}ファイルがないので作成しました。`)
  }
}