

▽目的  
GASでExcelファイルをスプレッドシートファイルに変換するスクリプトを作成しました。スプレッドシート名に通し番号を付けるため、フォルダ内に存在するファイル数を取得してファイル名に利用しようとしたのですが、うまくいきません。

▽結果  
・スプレッドシートへの変換は問題なく完了します。  
・スプレッドシートの文頭部分がNaNと表示されてしまいます。該当箇所はコード最終行の「ss.rename(numFiles + "_" +
filename);」で、numFilesに数字が入ってほしいのですが、NaNと記載されてしまします。  
・そもそも実行トランスクリプトを確認すると、途中の Logger.log(numFiles);で、undefinedと表示されています。

▽サンプルコード

[code]

    //Excelファイルをスプレッドシートに変換し、renameする
    function convertXls2SS(){
      var srcFolder = DriveApp.getFolderById(****); //Excelファイル格納フォルダ
      var aftFolder = DriveApp.getFolderById(****); //スプレッドシート格納フォルダ
      var files = srcFolder.getFilesByType(MimeType.MICROSOFT_EXCEL);
    
      //スプレッドシート格納フォルダ内のファイル数取得
      var ssFiles = aftFolder.getFiles();
      var numFiles = ssFiles.length;
      Logger.log(numFiles);
    
    //  var files = srcFolder.searchFiles('mimeType='+'"application/vnd.ms-excel"');
      while(files.hasNext()){
        //ファイル数をカウントアップ
        numFiles++;
        //変換前のExcelをスプレッドシートに変換する
        var file = files.next();
        var res = Drive.Files.insert({
          "mimeType": MimeType.GOOGLE_SHEETS,
          "parents": [{id: ****}],
          "title": file.getName()
        }, DriveApp.getFileById(file.getId()).getBlob());
    
        //シート名を変える
        var ss = SpreadsheetApp.openById(res.id);        
        ss.rename(numFiles + "_" + filename);
    
[/code]

以上です。お力お貸しいただけますと幸いです。


CC BY-SA 4.0
2018-06-30T07:05:14.213
45186
2019-04-05T15:02:35.497
2018-06-30T07:39:38.780
76
27501
question
google-apps-script
フォルダ内のファイル数を取得し、新規に作成するファイル名に利用する


このような解決法は如何でしょうか。問題の原因は、DriveAppのメソッド
`getFiles()`が返す値がFileIteratorだからです。配列ではないため、`ssFiles.length`は、undefinedを返します。ファイル数を取得するための方法は次の２パターンがあるかと思われます。他にも方法があるかと思われますので、この回答はそれらの中の一つとして捉えてください。`numFiles`のみ問題があるとのことなので、その部分について回答させていただきます。

## パターン 1 :

`getFiles()`が返すファイルの数を取得したい場合は、次のように変更してください。

### From :

[code]

    var ssFiles = aftFolder.getFiles();
    var numFiles = ssFiles.length;
    Logger.log(numFiles);
    
[/code]

### To :

[code]

    var ssFiles = aftFolder.getFiles();
    var numFiles = 0;
    while (ssFiles.hasNext()) {
      ssFiles.next();
      numFiles += 1;
    }
    Logger.log(numFiles);
    
[/code]

## パターン 2 :

`ssFiles.length`のように、配列のサイズとしてファイル数を取得したい場合は、Googleの拡張サービスのDrive
APIを使用して次のように変更することができます。すでにスクリプトの中でGoogleの拡張サービスのDrive
APIを使用されていましたので、こちらのパターンも提案させていただきました。（"From
:"は上記と同じです。）もしもファイル数が多い場合は、こちらの方が速度は速いと思われます。

### To :

[code]

    var numFiles = Drive.Files.list({q: "'### folderId ###' in parents and mimeType!='" + MimeType.FOLDER + "'"}).items.length;
    Logger.log(numFiles);
    
[/code]

### 注意するところ :

  * このスクリプトを使用する場合は、`var aftFolder = DriveApp.getFolderById(****); //スプレッドシート格納フォルダ` は不要です。 
    * 代わりに`### folderId ###`へ`****`を入れて下さい。

### 参考 :

  * [getFiles()](https://developers.google.com/apps-script/reference/drive/drive-app#getfiles)
  * [FileIterator](https://developers.google.com/apps-script/reference/drive/file-iterator)
  * [Googleの拡張サービス](https://developers.google.com/apps-script/guides/services/advanced)


CC BY-SA 4.0
2018-07-02T23:36:35.990
45246
2018-07-02T23:36:35.990
19460
45186
answer