Amazonなどのサイトによっては商品を入稿するときにCSVではなく、カンマ区切りのtxt形式でアップロードしなければいけない場合があります。
そんなときに、CSVファイルをカンマ区切りのテキストファイル(拡張子 txt)に変換する方法について、Googleドライブにあるファイルを変換する方法を実例で解説しています。
CSVファイルをテキストファイルに変換する方法
そもそもですが、CSVファイルをテキストファイルに変換するには、実は拡張子を「.csv」から「.txt」に変換するだけで対応できます。
例えば「APPダウンロード項目.csv」というファイルがあるとします。
これを開くと以下のようになります。
このファイルの拡張子を「.txt」に変更するとテキストファイルになります。
つまり、通常のカンマ区切りのCSVファイルを作成して、そのファイル名の拡張子を「.csv」から「.txt」に変更すればカンマ区切りのCSVファイルになります。
実例1: Googleドライブ上のCSVファイルをtxtファイルに変換する方法
いきなり結論ですが、Googleドライブ上のCSVファイルのファイル名を変更してtxtファイルにするには以下のようにします。
function convertToTxt(){
const folderId = "GoogleドライブのID"
const folder = DriveApp.getFolderById(folderId);
const csvFiles = folder.getFilesByType( MimeType.CSV );
while (csvFiles.hasNext()) {
let csvFile = csvFiles.next();
let fileName = csvFile.getName().replace( /(\.csv.*)/, ".txt" );
csvFile.setName(fileName);
console.log(csvFile);
}
}
例えば、以下のようなファイルが入ったGoogleドライブがあるとします。
この中で、csvファイルに該当するのは上の4つです。プログラムを実行するとjpegとpdfファイルは無視して、csvファイルの名前のみ変換します。
変換後のファイルをダウンロードするときちんとtxtファイルとして認識されます。
ダブルクリックで開けば、カンマ区切りのテキストファイルとなります。
コードの解説
function convertToTxt(){
const folderId = "GoogleドライブのID"
const folder = DriveApp.getFolderById(folderId);
const csvFiles = folder.getFilesByType( MimeType.CSV );
while (csvFiles.hasNext()) {
let csvFile = csvFiles.next();
let fileName = csvFile.getName().replace( /(\.csv.*)/, ".txt" );
csvFile.setName(fileName);
}
}
使用したコードの解説をしていきます。
DriveApp
一番最初に出てくる「DriveApp」とは、GASでGoogleドライブを操作するためのメソッドが用意されたクラスです。
ファイルを生成するcreateFileメソッドやIDを指定してファイルを取得するgetFileByIdメソッドなどを使うことができます。
(参考)AppScript > Class DriveApp
DriveApp.getFolderById(folderId);
DriveApp.getFolderById(folderId);
DriveAppクラスのgetFolderByIdメソッドを使うと、引数で指定したGoogleドライブのフォルダを取得することができます。
GoogleドライブのフォルダIDはURLの/folders/以下の部分になります。
getFilesByType
次に、取得したフォルダの中の全てのCSVファイルを取得するためにgetFilesByTypeメソッドを使います。
getFilesByType(MIMEタイプ)
引数でMIMEタイプを指定すると、指定したMIMEタイプを持つBlobオブジェクトのみを取得することができます。
CSVを指定するときはMIMEタイプに「MimeType.CSV」を指定します。
フォルダ.getFilesByType( MimeType.CSV );
なお、フォルダ内の全てのファイルを取得したい場合は「getFilesメソッド」を使います。
while
whileはJavaScriptの構文です。
while (条件式){ 処理 }
条件式がfalseになるまで処理を繰り返します。
hasNext
hasNextメソッドはGASでgoogleドライブの中のファイルを1つづつ順に取得し、ファイルがある場合はtrueを、ない場合はfalseを返します。
whileの条件式で使用することが多く、ファイルを1つずつ取得して処理を繰り返すときに使えます。
const csvFiles = folder.getFilesByType( MimeType.CSV );
while (csvFiles.hasNext()) {
let csvFile = csvFiles.next();
let fileName = csvFile.getName().replace( /(\.csv.*)/, ".txt" );
csvFile.setName(fileName);
}
}
next
nextメソッドはgoogleドライブの次のファイルを取得するためのメソッドです。1番初めに使用したときは最初のファイルを取得します(1つ目をすっ飛ばすわけではありません)
ファイル群.next();
getName
getNameメソッドは指定したファイルのファイル名を取得するメソッドです。
csvFile.getName().replace( /(\.csv.*)/, ".txt" );
ここではreplaceメソッドと組み合わせて、取得したファイルの「.csv~」を「.txt」に変換しています。
Googleドライブではファイルをコピーするとファイル名の拡張子の後ろに「~のコピー」という名前がつきます。拡張子が変わってしまいますが、ファイルのMIMEタイプ自体は元のファイルのままなので拡張子を修正しています。
- 「APPダウンロード項目.csv」→「APPダウンロード項目.txt」
- 「APPダウンロード項目2.csv のコピー」→「APPダウンロード項目2.txt」
setName
setNameはファイルのファイル名を指定するメソッドです。
replaceメソッドを使って「.csv~」を「.txt」に変換した文字列をファイル名として指定しています。
let fileName = csvFile.getName().replace( /(\.csv.*)/, ".txt" );
csvFile.setName(fileName);
実例2: 変換後は違うフォルダに入れる場合
コード
Googleドライブでファイルを「CSV」→「TXT」への変換をファイル名を直接編集するのではなく、変換後のファイルを別のフォルダに入れたい場合は以下のように記述します。
function convertToTxt(){
const folderId = "フォルダID"
const folder = DriveApp.getFolderById(folderId);
const csvFiles = folder.getFilesByType( MimeType.CSV );
const copyFolderId = "コピー先のフォルダID";
const copyFolder = DriveApp.getFolderById( copyFolderId );
while (csvFiles.hasNext()) {
let csvFile = csvFiles.next();
let fileName = csvFile.getName().replace( /(\.csv.*)/, ".txt" );
csvFile.makeCopy( fileName, copyFolder );
}
}
この処理を実行すると、以下のようなフォルダのCSVファイルのみを取得し、ファイル名を.txtに変換したファイルを生成して、そのファイルを「変換後のフォルダ」に自動で格納してくれます。
↓
実際に運用する場合は、ファイルの重複チェックや、既に変換済みかどうかなどのフラグを設けるとより実用的になります。
コードの解説|makeCopy
使っているコードは既に説明したものと基本的に同じです。変化点はmakeCopyメソッドを追加で使っているぐらいです。
makeCoypはGoogleドライブのファイルをコピーしてくれる便利なメソッドです。第1引数でファイル名、第2引数で保存先のフォルダを指定します。
makeCopy(ファイル名, 保存先)
なお、引数はどちらも省略可能です。
makeCopy(ファイル名)
保存先を省略した場合は、コピー元のファイルがあるフォルダに指定した名前で生成します。
makeCopy()
引数をすべて省略した場合は、コピー元のファイルがあるフォルダに「~のコピー」という名前で生成します。
参考
- AppScript > Class DriveApp
- AppScript > Class Folder
- AppScript > Class FileIterator (next, hasNext)
- AppScript > Class File > makeCopy(name, destination)