GoogleDrive上に1ファイルで100GBを超えるファイルがアップロードされており、WEBダウンロードに失敗するという事象が発生した為にGoogleDriveにアップロード済のファイルを1ファイル100GB未満に分割するファイル分割用のGAS(Google Apps Script)を作成しました。
今回はChatGTPのアドバイスのみで作成することが出来ました。
ここで完成版のスクリプトを公開します。
スクリプトの説明
分割対象のファイルのfileIDと分割ファイルサイズのsplitSize、分割ファイル出力先のフォルダのfolderIdをスプレットシートで指定して、ファイル分割処理を行います。
分割したファイルはワイルドカードを使用したファイル連結コマンドで結合出来るように元のファイル名末尾に「_part001」~「_parNNN」を連番で付与します。
GASの使い方
分割対象ファイルのアイテムID、分割ファイルサイズ(bytes)、分割ファイル出力先フォルダのアイテムIDを入力して
「ファイル分割GAS実行ボタン」を押します。
ファイル分割処理が終了すると「終了しました」と表示されます。
GAS本文
function BunkatsuFunction() {
// スプレッドシートの読み込み
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// シートの選択
const sheet = spreadsheet.getSheetByName('ファイル分割');
// セルの選択
const range1 = sheet.getRange('B3');
// セルの値を取得する
const fileId = range1.getValue();
// セルの選択
const range2 = sheet.getRange('C3');
// セルの値を取得する
const splitSize = range2.getValue();
var range3 = sheet.getRange('D3');
// セルの値を取得する
var folderId = range3.getValue();
// ファイルを取得
var file = DriveApp.getFileById(fileId);
var fileName = file.getName();
var fileSize = file.getSize();
// ファイルのバイトデータを読み取る
var fileData = file.getBlob().getBytes();
// 分割ファイルを作成
var startByte = 0;
var partNumber = 1;
while (startByte < fileSize) {
var endByte = Math.min(startByte + splitSize, fileSize);
var partData = fileData.slice(startByte, endByte); // ファイルデータを分割
// partNumberを3桁のゼロパディングで生成
var partNumberString = Utilities.formatString('%03d', partNumber);
// 分割ファイルを作成し、指定のフォルダに保存
var partBlob = Utilities.newBlob(partData, 'application/octet-stream', fileName + "_part" + partNumberString);
DriveApp.getFolderById(folderId).createFile(partBlob);
// 次の分割を準備
startByte = endByte;
partNumber++;
}
// 完了メッセージを表示
Logger.log("ファイルを分割しました。");
}
分割したファイルの結合方法
下記のようなコマンドで結合します。
copy /b C:\WORK\*_part* C:\WORK\sample.zip
あとがき
テストでは10MBのファイルを1MBに分割できるかを確認したのみですが
時間のある時に100GBを超えるファイルを処理できるかも確認しようと思います。