
指定したGoogleドライブフォルダにファイルをコピー[GAS]
前回、「指定したGoogleドライブフォルダにショートカットを作成」という記事を書きました。
場合によっては「ショートカットではなくファイルをコピーしたい」ということもあるかと思います。
前回記事の「人事評価シート提出」と同じ例でファイルコピーを実現します。
(前提条件:前回記事を一部修正し再掲)
例として、
「人事評価シート(Googleスプレッドシート)を社員各自が記入しGoogleフォームで提出する」こととし、受け取った側は部署ごとのフォルダにスプシファイルをコピーしたいとします。
各社員は人事評価シートに記入後、配布されたGoogleフォームに「氏名
」「部署」「シートURL」を記入し提出します。

各社員から提出されたフォームはスプレッドシートに集約されます。

なお、コピーしたファイルを割り振る「部署ごとのGoogleドライブフォルダ」をあらかじめ作成しておき、列C「部署名」を参照し列Eに「部署フォルダID」をVLOOKUPで返す仕組みを構築しておきます。

(再掲ここまで)
以上の例を前提として、指定したGoogleドライブフォルダにファイルをコピーするGASはこちら。
(各社員からの提出がそろったところで実行する、という前提のスクリプトです。)
function copyFile() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 1');
const lastRow = sheet.getLastRow();
for (let i = 2; i < lastRow; i++) {
const url = sheet.getRange(i, 4).getValue();
if (!url) {
continue;
}
const id = url.split('/d/')[1].split('/')[0];
const tgtFolder = DriveApp.getFolderById(sheet.getRange(i, 5).getValue());
DriveApp.getFileById(id).makeCopy(tgtFolder);
}
}
getFileByIdメソッドで「コピーしたいファイルのID」を取得し、
makeCopyメソッドに「コピーしたファイルを格納したいフォルダのID」を渡すことで、指定したフォルダにコピーされます。

ファイル名の末尾が「…のコピー」となってしまいました。
ちょっとイケてないですね。
修正します。
ついでに提出されたタイムスタンプもファイル名の先頭に付与してみます。
function copyFile() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 1');
const lastRow = sheet.getLastRow();
for (let i = 2; i < lastRow; i++) {
const url = sheet.getRange(i, 4).getValue();
if (!url) {
continue;
}
const timeStamp = sheet.getRange(i, 1).getValue();
const timeStr = Utilities.formatDate(timeStamp, 'JST', 'yyyyMMdd_HHmmss') + '_';
const id = url.split('/d/')[1].split('/')[0];
const tgtFolder = DriveApp.getFolderById(sheet.getRange(i, 5).getValue());
const fileName = DriveApp.getFileById(id).getName();
const rename = timeStr + fileName;
DriveApp.getFileById(id).makeCopy(rename, tgtFolder);
}
}
ファイル名の末尾から「...のコピー」がなくなり、先頭にタイムスタンプを付与しました。
