GAS(Google Apps Script)でGoogleドライブを操作するには、DriveApp でフォルダ(Folder)やファイル(File)を取得し、そのオブジェクトのメソッドを呼びます。 ファイルの一覧は配列ではなく FileIterator(イテレータ)で返るので、hasNext と next のループで1件ずつ取り出すのが基本の形です。

この記事はドライブ側の操作だけに絞り、「やりたいこと→メソッド→戻り値」の早見表、一覧をシートに書き出すコード、searchFiles のクエリ例、フォルダ作成・コピー・移動・ゴミ箱、PDF保存、共有権限、ファイル数が多いときの分割実行までを、貼って使える関数の形で並べました。

確認環境:メソッド名・引数・戻り値・上限値は Google Apps Script 公式リファレンス(developers.google.com/apps-script、2026-10-05 閲覧)の記載に合わせています。掲載コードの構文は Node.js 22.22 の node --check で確認しました。

DriveApp・Folder・Fileの早見表

IDは、ドライブのURLに含まれる文字列です。フォルダは folders/ の後ろ、ファイルは /d/ の後ろがIDです。

取得する

やりたいこと メソッド 戻り値
IDでファイルを取得 DriveApp.getFileById(id) File
IDでフォルダを取得 DriveApp.getFolderById(id) Folder
マイドライブの最上位を取得 DriveApp.getRootFolder() Folder
フォルダ内のファイルを全部 folder.getFiles() FileIterator
フォルダ内のサブフォルダを全部 folder.getFolders() FolderIterator
名前が一致するファイル folder.getFilesByName(name) FileIterator
名前が一致するサブフォルダ folder.getFoldersByName(name) FolderIterator
種類(MIMEタイプ)で絞る folder.getFilesByType(mimeType) FileIterator
条件を組み合わせて検索 folder.searchFiles(params) / DriveApp.searchFiles(params) FileIterator
フォルダを検索 folder.searchFolders(params) / DriveApp.searchFolders(params) FolderIterator
ファイルの親フォルダ file.getParents() FolderIterator

作る・コピーする・動かす・片づける

やりたいこと メソッド 戻り値
フォルダを作る folder.createFolder(name) Folder
テキストファイルを作る folder.createFile(name, content) File
種類を指定してファイルを作る folder.createFile(name, content, mimeType) File
Blob からファイルを作る folder.createFile(blob) File
ショートカットを作る folder.createShortcut(targetId) File
同じフォルダにコピー file.makeCopy() / file.makeCopy(name) File
別のフォルダにコピー file.makeCopy(name, destination) File
移動する file.moveTo(destination) / folder.moveTo(destination) File / Folder
名前を変える file.setName(name) / folder.setName(name) File / Folder
ゴミ箱に入れる・戻す file.setTrashed(true) / file.setTrashed(false) File
PDFなど別の形式で取り出す file.getAs(contentType) Blob
中身をそのまま取り出す file.getBlob() Blob

情報を読む・共有する

やりたいこと メソッド 戻り値
名前・ID・URL getName() / getId() / getUrl() String
種類(MIMEタイプ) file.getMimeType() String
サイズ(バイト) getSize() Integer
作成日時・更新日時 getDateCreated() / getLastUpdated() Date
リンクの公開範囲を決める setSharing(accessType, permissionType) File / Folder
閲覧者・編集者を追加 addViewer(emailAddress) / addEditor(emailAddress) File / Folder
コメント可で追加(ファイル) file.addCommenter(emailAddress) File
閲覧者・編集者から外す removeViewer(emailAddress) / removeEditor(emailAddress) File / Folder
その人の権限をすべて外す revokePermissions(emailAddress) File / Folder
今の公開範囲と権限を読む getSharingAccess() / getSharingPermission() Access / Permission
一覧の続きから再開する iterator.getContinuationToken() → DriveApp.continueFileIterator(token) String → FileIterator

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「GAS Googleドライブ操作|DriveAppでファイル一覧・コピー・移動」

全体像:DriveApp→Folder→Fileの順にたどる

クラス 役割 主な入口
DriveApp ドライブ全体の入口。IDでの取得、全体検索 DriveApp.getFolderById(id)
Folder フォルダ1つ。中のファイル・サブフォルダの取得と作成 folder.getFiles()
File ファイル1つ。コピー・移動・名前変更・共有・変換 file.makeCopy(name, destination)
FileIterator / FolderIterator 一覧を1件ずつ取り出すための入れ物 hasNext() / next()

DriveApp に直接 createFile や createFolder を呼ぶと、マイドライブの最上位に作られます。 置き場所を決めたいときは、先にフォルダを取得して folder.createFile のように呼びます。この記事のコードは、すべてフォルダIDを起点にしています。

各コードの先頭にある FOLDER_ID などの定数は、自分のドライブのIDに書き換えて使います。

フォルダ内のファイル一覧を取得してシートに書き出す

getFiles の戻り値は FileIterator です。メソッドは次の3つだけです。

メソッド 戻り値 内容
hasNext() Boolean 次の1件があれば true
next() File 次の1件を返す。残りが無いときに呼ぶと例外になる
getContinuationToken() String 続きから再開するためのトークン。公式リファレンスでは、おおむね1週間有効とされている

配列ではないので length や forEach は使えません。while (files.hasNext()) で回し、next() で取り出した値を配列に積んでいきます。

次の関数は、フォルダ内のファイルを「名前・種類・サイズ・更新日時・URL・ID」の表にして、スプレッドシートの「ファイル一覧」シートに書き出します。スプレッドシートに紐づけたスクリプト(拡張機能 → Apps Script)に貼って実行します。

const FOLDER_ID = 'ここにフォルダID';

function listFilesToSheet() {
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const files = folder.getFiles();
  const rows = [['名前', '種類', 'サイズ(バイト)', '更新日時', 'URL', 'ID']];

  while (files.hasNext()) {
    const file = files.next();
    rows.push([
      file.getName(),
      file.getMimeType(),
      file.getSize(),
      file.getLastUpdated(),
      file.getUrl(),
      file.getId(),
    ]);
  }

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('ファイル一覧') || ss.insertSheet('ファイル一覧');
  sheet.clearContents();
  sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
  sheet.setFrozenRows(1);
}

ポイントは2つです。

  • ループの中ではシートに書かず、配列に積んで最後に setValues で1回だけ書きます。 1件ごとに書き込むより呼び出し回数が少なくなり、実行時間を短くできます。
  • 並び順は指定できないので、名前順や更新日順にしたい場合は、書き出す前に配列を並べ替えます(見出し行を除いて rows.slice(1).sort(...) とする)。

サブフォルダの中もまとめて一覧にする

getFiles が返すのは、そのフォルダ直下のファイルだけです。サブフォルダの中も含めるときは、getFolders で得たフォルダに対して同じ処理を繰り返します。

const ROOT_FOLDER_ID = 'ここにフォルダID';

function listFilesRecursive() {
  const rows = [['パス', '名前', '更新日時', 'URL']];
  collectFiles_(DriveApp.getFolderById(ROOT_FOLDER_ID), '', rows);

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('全ファイル') || ss.insertSheet('全ファイル');
  sheet.clearContents();
  sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}

function collectFiles_(folder, parentPath, rows) {
  const path = parentPath + '/' + folder.getName();

  const files = folder.getFiles();
  while (files.hasNext()) {
    const file = files.next();
    rows.push([path, file.getName(), file.getLastUpdated(), file.getUrl()]);
  }

  const subFolders = folder.getFolders();
  while (subFolders.hasNext()) {
    collectFiles_(subFolders.next(), path, rows);
  }
}

フォルダの階層が深くファイル数が多いと、1回の実行時間の上限に届くことがあります。その場合は後半の「ファイル数が多いときは分割して実行する」の方法に切り替えます。

searchFilesで条件を指定して探す

名前の一部、種類、更新日などで絞るときは searchFiles を使います。引数は検索条件を書いた文字列(クエリ)で、公式リファレンスには Drive API v3 の書き方を使うと記されています。ファイル名の項目名は name です(Drive API v2 では title でした)。

クエリ例の一覧

探したいもの クエリ
名前が完全に一致 name = '議事録'
名前が「見積」で始まる語を含む name contains '見積'
本文や説明に語を含む fullText contains '備品'
語句をそのままの並びで含む fullText contains '"備品 予約"'
PDFだけ mimeType = 'application/pdf'
Google スプレッドシートだけ mimeType = 'application/vnd.google-apps.spreadsheet'
Google ドキュメントだけ mimeType = 'application/vnd.google-apps.document'
フォルダ以外 mimeType != 'application/vnd.google-apps.folder'
指定日時より後に更新 modifiedTime > '2026-10-01T00:00:00'
指定日時より後に作成 createdTime > '2026-01-01T00:00:00'
ゴミ箱に入っていない trashed = false
スター付き starred = true
特定の人がオーナー 'taro@example.com' in owners
特定の人が編集できる 'taro@example.com' in writers
自分に共有されたもの sharedWithMe = true
条件を両方満たす name contains '見積' and mimeType = 'application/pdf'
どちらかを満たす name contains '見積' or name contains '請求'
条件に当てはまらない not name contains '下書き'

使える演算子は、contains、=、!=、<、<=、>、>=、in、has、and、or、not です。Google Drive API のリファレンスでは、name に対する contains は前方一致(語の先頭からの一致)、fullText に対する contains は語単位の一致と説明されています。日時は RFC 3339 形式で書き、タイムゾーンを省くと UTC として扱われます。

検索結果をログに出すコード

const SEARCH_FOLDER_ID = 'ここにフォルダID';

function searchPdfInFolder() {
  const folder = DriveApp.getFolderById(SEARCH_FOLDER_ID);
  const query =
    "name contains '見積' and mimeType = 'application/pdf' and trashed = false";
  const files = folder.searchFiles(query);

  while (files.hasNext()) {
    const file = files.next();
    console.log(file.getName() + ' ' + file.getUrl());
  }
}

folder.searchFiles はそのフォルダ直下が対象、DriveApp.searchFiles はドライブ全体が対象です。

名前に引用符が入るときの書き方

クエリの値は単一引用符で囲むため、名前に ' や \ が含まれるときは、前に \ を付けてエスケープします。 変数から組み立てるときは、次の小さな関数を通すと安心です。

function toQueryValue(text) {
  return "'" + String(text).replace(/\\/g, '\\\\').replace(/'/g, "\\'") + "'";
}

function searchByExactName(name) {
  const files = DriveApp.searchFiles('name = ' + toQueryValue(name) + ' and trashed = false');
  const result = [];
  while (files.hasNext()) {
    result.push(files.next());
  }
  return result;
}

toQueryValue は純粋な文字列処理なので、Node.js 22 でもそのまま動かせます。確かめた結果は次のとおりです。

入力: Quinn's paper\essay
出力: 'Quinn\'s paper\\essay'

フォルダを作る・ファイルを作る

同じ名前のフォルダがあれば使い、無ければ作る

ドライブでは同じ場所に同じ名前のフォルダを複数置けるため、createFolder を呼ぶたびにフォルダが増えます。日付ごとのフォルダを毎日作るような処理では、先に getFoldersByName で探し、見つからないときだけ作ると、同じ名前のフォルダが増えません。

const PARENT_FOLDER_ID = 'ここに親フォルダID';

function getOrCreateFolder(parent, name) {
  const found = parent.getFoldersByName(name);
  return found.hasNext() ? found.next() : parent.createFolder(name);
}

function createDailyFolder() {
  const parent = DriveApp.getFolderById(PARENT_FOLDER_ID);
  const name = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd');
  const folder = getOrCreateFolder(parent, name);
  console.log(folder.getName() + ' ' + folder.getUrl());
}

テキストやCSVのファイルを作る

function createTextFiles() {
  const folder = DriveApp.getFolderById(PARENT_FOLDER_ID);

  // テキストファイル
  folder.createFile('memo.txt', '備品の棚卸しは月末に行う');

  // 種類を指定(CSV)
  const csv = '品名,数量\nノート,10\nペン,25\n';
  const file = folder.createFile('stock.csv', csv, 'text/csv');
  console.log(file.getId());
}

コピー・移動・名前変更・ゴミ箱

ひな形をコピーして別フォルダに置く

makeCopy(name, destination) は、名前とコピー先フォルダを同時に指定できます。戻り値はコピーでできた新しい File です。

const TEMPLATE_FILE_ID = 'ここにひな形のファイルID';
const DEST_FOLDER_ID = 'ここにコピー先フォルダID';

function copyTemplate() {
  const template = DriveApp.getFileById(TEMPLATE_FILE_ID);
  const dest = DriveApp.getFolderById(DEST_FOLDER_ID);
  const name = '月次レポート_' + Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM');
  const copy = template.makeCopy(name, dest);
  console.log(copy.getUrl());
}

移動はmoveToを使う

以前は「移動先に addFile で追加し、元のフォルダから removeFile で外す」という2段階の書き方が広く使われていました。公式リファレンスでは Folder の addFile・removeFile・addFolder・removeFolder は非推奨とされ、代わりに moveTo(または createShortcut)を使うよう案内されています。

以前の書き方(非推奨) 今の書き方
dest.addFile(file); src.removeFile(file); file.moveTo(dest);
dest.addFolder(folder); src.removeFolder(folder); folder.moveTo(dest);
複数のフォルダに同じファイルを置く dest.createShortcut(file.getId());

次の関数は、フォルダ内のPDFをすべて「保管」フォルダに移動します。

const SRC_FOLDER_ID = 'ここに移動元フォルダID';
const ARCHIVE_FOLDER_ID = 'ここに移動先フォルダID';

function movePdfToArchive() {
  const src = DriveApp.getFolderById(SRC_FOLDER_ID);
  const archive = DriveApp.getFolderById(ARCHIVE_FOLDER_ID);
  const files = src.getFilesByType('application/pdf');
  let count = 0;

  while (files.hasNext()) {
    files.next().moveTo(archive);
    count++;
  }
  console.log(count + '件を移動しました');
}

名前を変える・ゴミ箱に入れる・戻す

DriveApp の File・Folder には、完全に削除するメソッドはありません。片づけるときは setTrashed(true) でゴミ箱に入れ、戻すときは setTrashed(false) を呼びます。

function renameAndTrash() {
  const file = DriveApp.getFileById('ここにファイルID');

  file.setName('2026-10_備品一覧');   // 名前を変える
  file.setTrashed(true);              // ゴミ箱に入れる
  file.setTrashed(false);             // ゴミ箱から戻す
}

setName や setTrashed は自分自身(File)を返すので、file.setName('a').moveTo(folder) のようにつなげて書けます。

getAsでPDFにして保存する

Google ドキュメントやスプレッドシートをPDFにするには、file.getAs('application/pdf') で Blob(ファイルの中身を表すオブジェクト)を取り出し、folder.createFile(blob) で保存します。

const SOURCE_FILE_ID = 'ここに変換したいファイルのID';
const PDF_FOLDER_ID = 'ここにPDFの保存先フォルダID';

function saveAsPdf() {
  const source = DriveApp.getFileById(SOURCE_FILE_ID);
  const folder = DriveApp.getFolderById(PDF_FOLDER_ID);

  const stamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMdd');
  const blob = source.getAs('application/pdf');
  blob.setName(source.getName() + '_' + stamp + '.pdf');

  const pdf = folder.createFile(blob);
  console.log(pdf.getName() + ' ' + pdf.getUrl());
}
メソッド 返るもの 使いどころ
file.getAs('application/pdf') PDFに変換した Blob ドキュメントやシートをPDFで残す、メールに添付する
file.getBlob() 変換しない中身の Blob 画像やPDFなどをそのまま別の場所に複製する、メールに添付する

公式リファレンスの getAs の説明では、ほとんどの Blob で指定できる変換先は application/pdf で、画像(BMP・GIF・JPEG・PNG)どうしの変換にも対応するとされています。

共有権限を設定する

共有の設定には、「リンクの公開範囲をまとめて決める setSharing」と「人を個別に追加する addViewer・addEditor」の2系統があります。

setSharingの2つの引数

1つ目が「誰がアクセスできるか(Access)」、2つ目が「何ができるか(Permission)」です。

DriveApp.Access 意味(公式リファレンスの説明)
PRIVATE 明示的に権限を与えた人だけ。ログインが必要
DOMAIN_WITH_LINK 同じドメインでリンクを知っている人。ログインが必要(Google Workspace のみ)
DOMAIN 同じドメインの人が検索して見つけられる。ログインが必要(Google Workspace のみ)
ANYONE_WITH_LINK リンクを知っている全員。ログイン不要
ANYONE インターネット上の誰でも検索して見つけられる。ログイン不要
DriveApp.Permission 意味 setSharing で指定
VIEW 閲覧とコピー できる
COMMENT 閲覧・コピー・コメント できる
EDIT 編集(制限していなければ共有設定の変更も) できる
NONE 権限なし Access.ANYONE と組み合わせる場合のみ
OWNER / ORGANIZER / FILE_ORGANIZER オーナーや共有ドライブの役割 読み取り専用(指定はできない)

ANYONE と ANYONE_WITH_LINK は、ドメインの管理者が制限している場合があります。

リンク共有と個別追加のコード

function shareFile() {
  const file = DriveApp.getFileById('ここにファイルID');

  // リンクを知っている人は閲覧できる
  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);

  // 人を個別に追加する
  file.addViewer('hanako@example.com');
  file.addEditor('taro@example.com');
  file.addCommenter('jiro@example.com');

  console.log(file.getSharingAccess() + ' / ' + file.getSharingPermission());
}

function unshareFile() {
  const file = DriveApp.getFileById('ここにファイルID');

  // リンク共有をやめ、追加した人だけに戻す
  file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.VIEW);

  // 個別の権限を外す
  file.removeViewer('hanako@example.com');
  file.revokePermissions('taro@example.com');
}

フォルダに setSharing や addViewer を設定すると、フォルダ単位で共有できます。Folder には addCommenter が無い点だけ File と違います。

共有状況を一覧にして見直す

フォルダ内のファイルが「誰に・どの範囲で」共有されているかを表にしておくと、公開範囲の見直しに使えます。

function listSharing() {
  const folder = DriveApp.getFolderById('ここにフォルダID');
  const files = folder.getFiles();
  const rows = [['名前', '公開範囲', '権限', '編集者', '閲覧者']];

  while (files.hasNext()) {
    const file = files.next();
    rows.push([
      file.getName(),
      String(file.getSharingAccess()),
      String(file.getSharingPermission()),
      file.getEditors().map((u) => u.getEmail()).join(', '),
      file.getViewers().map((u) => u.getEmail()).join(', '),
    ]);
  }

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('共有状況') || ss.insertSheet('共有状況');
  sheet.clearContents();
  sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}

ファイル数が多いときは分割して実行する

実行時間の上限

Google の公式ページ「Quotas for Google Services」には、次の上限が載っています(2026-10-05 閲覧)。

項目 上限
スクリプトの実行時間 1回の実行につき6分
カスタム関数の実行時間 1回の実行につき30秒
トリガーの合計実行時間 無料アカウントは1日90分、Google Workspace アカウントは1日6時間
トリガーの数 1ユーザー・1スクリプトあたり20個

上限に届くと、スクリプトは例外を出してその場で止まります。数千件のファイルを1回で処理しようとすると6分に届くことがあるので、途中で区切って続きから再開できる形にしておきます。

getContinuationTokenで続きから再開する

FileIterator の getContinuationToken() が返す文字列を保存しておくと、次の実行で DriveApp.continueFileIterator(token) を呼んで続きの位置から取り出せます。保存先にはスクリプト プロパティが使えます。

次の関数は、4分を過ぎたらトークンを保存して終了し、次に実行したときは続きから一覧をシートに追記します。最後まで終わるとトークンを消します。

const BIG_FOLDER_ID = 'ここにフォルダID';
const TOKEN_KEY = 'DRIVE_LIST_TOKEN';
const TIME_LIMIT_MS = 4 * 60 * 1000; // 6分の上限より手前の4分で区切る

function listFilesInBatches() {
  const started = Date.now();
  const props = PropertiesService.getScriptProperties();
  const token = props.getProperty(TOKEN_KEY);

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName('一覧(分割)');
  if (!sheet) {
    sheet = ss.insertSheet('一覧(分割)');
  }

  let files;
  if (token) {
    files = DriveApp.continueFileIterator(token);
  } else {
    files = DriveApp.getFolderById(BIG_FOLDER_ID).getFiles();
    sheet.clearContents();
    sheet.appendRow(['名前', '更新日時', 'URL']);
  }

  const rows = [];
  let finished = true;
  while (files.hasNext()) {
    if (Date.now() - started > TIME_LIMIT_MS) {
      finished = false;
      break;
    }
    const file = files.next();
    rows.push([file.getName(), file.getLastUpdated(), file.getUrl()]);
  }

  if (rows.length > 0) {
    sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, 3).setValues(rows);
  }

  if (finished) {
    props.deleteProperty(TOKEN_KEY);
    console.log('完了: 今回 ' + rows.length + ' 件');
  } else {
    props.setProperty(TOKEN_KEY, files.getContinuationToken());
    console.log('途中まで: 今回 ' + rows.length + ' 件。もう一度実行すると続きから再開します');
  }
}

使い方は次のとおりです。

  1. listFilesInBatches を手動で実行する。
  2. ログに「途中まで」と出たら、もう一度実行する。「完了」と出るまで繰り返す。
  3. 手で繰り返す代わりに、エディタの「トリガー」から時間主導型のトリガーを設定してもよい。完了後はトリガーを外す。

区切りの判定は next() を呼ぶ前に行います。 next() で取り出したあとに中断すると、その1件が記録されないまま次回に進んでしまうためです。また、トリガーで回す場合は上の表の「トリガーの合計実行時間」も消費します。

つまずきやすい点と直し方

起きること 原因 直し方
files.length が undefined になる、forEach が使えない getFiles の戻り値は配列ではなく FileIterator while (files.hasNext()) と next() で回す
next() で例外になる 残りが無いのに next() を呼んだ 必ず hasNext() を確かめてから呼ぶ
getFileById で例外になる IDが違う、またはアクセス権が無い URLからIDを取り直す。try…catch で受けてIDをログに出す
searchFiles で title を使うと期待どおりに見つからない Drive API v3 の項目名は name title を name に書き換える
name contains で語の途中が一致しない name の contains は前方一致 語の先頭から指定する。途中一致が必要なら一覧を取得して JavaScript の includes で絞る
同じ名前のフォルダが増えていく createFolder は呼ぶたびに新しいフォルダを作る getFoldersByName で探してから作る
途中で止まる 1回の実行時間(6分)に届いた getContinuationToken で分割する
ファイルが最上位にできる DriveApp.createFile を呼んでいる folder.createFile を使う

IDの指定に誤りがあっても処理全体を止めたくないときは、次のように1件ずつ受けます。

function trashByIds(ids) {
  const notFound = [];
  ids.forEach((id) => {
    try {
      DriveApp.getFileById(id).setTrashed(true);
    } catch (e) {
      notFound.push(id + ': ' + e.message);
    }
  });
  if (notFound.length > 0) {
    console.log('処理できなかったID\n' + notFound.join('\n'));
  }
}

よくある質問

Q. ファイルを完全に削除できますか? A. DriveApp の File・Folder にあるのは setTrashed で、ゴミ箱への出し入れまでです。まずゴミ箱に入れる形にしておくと、対象を取り違えたときも setTrashed(false) で戻せます。

Q. getFilesByName と searchFiles はどう使い分けますか? A. 名前が完全に一致するものを探すだけなら getFilesByName が短く書けます。種類や更新日など別の条件を組み合わせるとき、名前の先頭部分で探すときは searchFiles を使います。

Q. 同じ名前のファイルが複数あるときはどうなりますか? A. ドライブは同じフォルダに同じ名前のファイルを複数置けるため、getFilesByName も FileIterator を返します。1件だけと決めつけず、hasNext で回して更新日時などで選びます。確実に1つを指したいときはIDを使います。

Q. コピーや移動のあと、IDは変わりますか? A. makeCopy は新しいファイルを作るので、戻り値の File から getId で新しいIDを取得します。moveTo は同じファイルの置き場所を変える操作で、戻り値は同じ File です。

まとめ

  • DriveApp → Folder → File の順にたどり、一覧は FileIterator を hasNext と next で回す。
  • 一覧をシートに書くときは配列に積んで、最後に setValues で1回だけ書く。
  • 条件で探すときは searchFiles。項目名は name、name の contains は前方一致。
  • 移動は moveTo。addFile・removeFile は非推奨で、複数の場所に置きたいときは createShortcut。
  • PDF保存は getAs('application/pdf') で Blob を取り出し、folder.createFile(blob)。
  • 共有は setSharing(公開範囲)と addViewer・addEditor(個別追加)の2系統。
  • 1回の実行は6分まで。件数が多いときは getContinuationToken と continueFileIterator で分割する。

参考・出典

  • Google Apps Script リファレンス「Class DriveApp」 https://developers.google.com/apps-script/reference/drive/drive-app
  • Google Apps Script リファレンス「Class Folder」 https://developers.google.com/apps-script/reference/drive/folder
  • Google Apps Script リファレンス「Class File」 https://developers.google.com/apps-script/reference/drive/file
  • Google Apps Script リファレンス「Class FileIterator」 https://developers.google.com/apps-script/reference/drive/file-iterator
  • Google Apps Script リファレンス「Enum Access」「Enum Permission」 https://developers.google.com/apps-script/reference/drive/access
  • Google Apps Script「Quotas for Google Services」 https://developers.google.com/apps-script/guides/services/quotas
  • Google Drive API「Search for files and folders」「Search query terms and operators」 https://developers.google.com/workspace/drive/api/guides/search-files
  • Google Drive API「Google Workspace and Google Drive supported MIME types」 https://developers.google.com/workspace/drive/api/guides/mime-types

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「GAS Googleドライブ操作|DriveAppでファイル一覧・コピー・移動」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?