- クラウドサービス
GAS Googleドライブ操作|DriveAppでファイル一覧・コピー・移動
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 + ' 件。もう一度実行すると続きから再開します');
}
}
使い方は次のとおりです。
- listFilesInBatches を手動で実行する。
- ログに「途中まで」と出たら、もう一度実行する。「完了」と出るまで繰り返す。
- 手で繰り返す代わりに、エディタの「トリガー」から時間主導型のトリガーを設定してもよい。完了後はトリガーを外す。
区切りの判定は 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期連続の黒字決算。