GoogleAppsScriptでGoogleドライブのファイル操作するための自作関数の紹介

# 概要

Googleドライブのファイルやフォルダは、ファイルIDで管理されていて、同じフォルダ内に同名のファイルを作成することが可能ですが、ファイル名からのファイルの操作や管理が一癖あります。

そのため、痒いところに手が届くような自作のGoogleAppsScript関数をいくつか作成し、今後の開発するためのカンペを作っておこうと思います。

# 自作GAS関数

### 1. フォルダの存在確認する関数

対象となるフォルダを指定し、対象のファイル名が存在しているかチェックする関数です。第二引数のfolderIdを指定しない場合だと、マイドライブを参照するようにしています。


```js
// フォルダの存在チェックする関数
// @param folderName 探索フォルダ名を指定
// @param folderId 探索するフォルダIDを指定、空の場合はマイドライブとなる
// @return boolean true:存在する false:存在しない
const folderExists = (folderName, folderId = "") => {
  let homefolder = "";
  if (folderId === "") {
    homefolder = DriveApp.getRootFolder();
  } else {
    homefolder = DriveApp.getFolderById(folderId);
  }
  const targetFolders = homefolder.getFolders();

  let result = false;
  while (targetFolders.hasNext()) {
    let targetFolder = targetFolders.next();
    if (folderName === targetFolder.getName()) {
      result = true;
      break;
    }
  }
  return result;
};
```

### 2. ファイルの存在確認する関数

「1. フォルダの存在チェックする関数」のファイル版です。

```js
// ファイルの存在チェックする関数
// @param fileName フォルダ名
// @param folderId 探索するフォルダIDを指定、空の場合はマイドライブとなる
// @return boolean true:存在する false:存在しない
const fileExists = (fileName, folderId = "") => {
  let homefolder = "";
  if (folderId === "") {
    homefolder = DriveApp.getRootFolder();
  } else {
    homefolder = DriveApp.getFolderById(folderId);
  }
  const targetFiles = homefolder.getFiles();
  let result = false;
  while (targetFiles.hasNext()) {
    let targetFile = targetFiles.next();
    if (fileName === targetFile.getName()) {
      result = true;
      break;
    }
  }
  return result;
};
```

### 3. フォルダが存在するときにのみフォルダ作成する関数

「1. フォルダの存在チェックする関数」を利用し、フォルダの作成を行います。通常では、同名のフォルダがすでにある場合、別で同名フォルダを作成してしまうのですが、この関数では同名フォルダを作成しないようにしています。


```js
// フォルダが存在するときにのみフォルダ作成する関数
// @param folderName フォルダ名
// @param folderId 探索するフォルダIDを指定、空の場合はマイドライブとなる
const createFolder = (folderName, folderId = "") => {
  if (folderExists(folderName, folderId) === false) {
    DriveApp.createFolder(folderName);
  }
};
```

### 4. ファイルの上書き保存を疑似的に行う関数

GASで上書き保存する関数はないので作成しました。上書きと言いつつ、対象のファイルをゴミ箱に移動し、新しいファイルをコピペで作成することで疑似的に上書き保存を実装しています。

```js
// ファイルの上書き保存を疑似的に行う関数
// @param fileId コピーするファイルID
// @param folderId コピー先のフォルダIDを指定、空の場合はマイドライブとなる
const fileUpdate = (fileId,folderId = "") => {
  let targetFile = DriveApp.getFileById(fileId);
  let targetFileName = targetFile.getName();
  let targetFolder;
  if (folderId === "") {
    targetFolder = DriveApp.getRootFolder();
  } else {
    targetFolder = DriveApp.getFolderById(folderId);
  }
  const files = targetFolder.getFiles();
  while (files.hasNext()) {
    let file = files.next();
    if (file.getName() === targetFileName) {
      file.setTrashed(true);
    }
  }
  targetFile.makeCopy(targetFileName, targetFolder);
};
```

### 5. ファイル名を指定し削除する関数

ファイル名を指定し削除する関数です。同名のファイルが複数あった場合はすべて対象となります。


```js
// ファイル名を指定し削除する関数
// @param fileName 削除するファイル名
// @param folderId フォルダIDを指定、空の場合はマイドライブとなる
const fileDelete = (fileName,folderId = "") => {
  let homefolder = "";
  if (folderId === "") {
    homefolder = DriveApp.getRootFolder();
  } else {
    homefolder = DriveApp.getFolderById(folderId);
  }
  const targetFiles = homefolder.getFiles();
  
  while (targetFiles.hasNext()) {
    let targetFile = targetFiles.next();
    if (fileName === targetFile.getName()) {
      targetFile.setTrashed(true);
    }
  }
};
```

# おわり

今回は、GoogleAppsScriptでGoogleドライブのファイル操作するための自作関数の紹介しました。

今後の開発のお役に立てれれば幸いです。

ここまで読んでいただきありがとうございました。