この記事について
表題について少しはまったのでmemo。
やりたかったこと。
フォルダAのスプレッドシートをフォルダBにコピー(copyFile)する。
コピーファイルのidをゲットして、いろいろSpreadsheetAppクラスのメソッドを使って操作したい。
まず、Google Driveにおけるファイル操作は下記の2パターンある。
- DriveAppサービスを使う
- DriveAPIを使う
- スクリプトのプロジェクトに下記のいづれかの方法で明示的に読み込み設定が必要。
- マニフェストファイルに記述する
- リソース>Googleの拡張サービス>Drive APIのチェックをonにする
- スクリプトのプロジェクトに下記のいづれかの方法で明示的に読み込み設定が必要。
コピーの仕方にも色々あった。
前提
var sourceFolder = DriveApp.getFolderById(souceId); //ソースフォルダ
var destinationFolder = DriveApp.getFolderById(destId); //宛先フォルダ
var sourceFile = DriveApp.getFileById(fileId); //ソースファイル
var copyFile; //ここにコピーしたファイルを入れたい
方法1
copyFile = destinationFolder.createFile(sourceFile.getBlob());
copyFileId = workingFile.getId();
doc = SpreadsheetApp.openById(copyFileId).getSheets()[0];
なぜか、PDFとしてコピーされるので、3行目でエラーになる。
方法2
mimecode = "GOOGLE_SHEETS";
options = {
title: sourceFile.getName(),
mimeType: MimeType[mimecode],
parents: [{ id: destinationFolder.getId() }]
};
copyFile = Drive.Files.insert(options, sourceFile.getBlob());
copyFileId = copyFile.getId();
doc = SpreadsheetApp.openById(copyFileId).getSheets()[0];
なぜか、Google Document(.gdoc)としてコピーされるので、3行目でエラーになる。
方法3
copyFile = destinationFolder.addFile(sourceFile);
copyFileId = copyFile.getId();
doc = SpreadsheetApp.openById(copyFileId).getSheets()[0];
戻り値がFileではなくFolderなので、保留。
方法4
copyFile = sourceFile.makeCopy(sourceFile.getName(), destinationFolder);
copyFileId = copyFile.getId();
doc = SpreadsheetApp.openById(copyFileId).getSheets()[0];
求める結果になった。こちらを採用。
さいごに
なぜ、PDFやGoogle Docになるのか、不明なままです。
②に関してはmimetypeの指定方法が違うのかも。
もし、何かわかる方がいらっしゃればコメントいただけると嬉しいです。
個人的にはGoogle製品のコピーは"方法4"、MS Office製品をGoogle形式に変換する場合は"方法2"で良いのかなと思います。