🐈

【Google App Script】Google Drive内に保管された全てのファイルのシート名を出力する方法

2023/02/12に公開

コード

結論、下記スクリプトにより実行できる。

function getFiles(){

  // フォルダの指定
  const folderId= 'xxxxx';

 //フォルダ内のすべてのファイルを取得
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();
  const fileList = [];
  //各ファイルごとに出力
  while(files.hasNext()){
    
    let file = files.next();
    let fileName = file.getName(); // ファイル名(*今回は使用しない)
    let fileId = file.getId(); // ファイルID
    let fileURL = file.getUrl(); // ファイルURL(*今回は使用しない)
    fileList.push(fileId)
  }
  //ファイルのシートごとに出力
  for(let n = 0; n < fileList.length; n++){
    const sheets = SpreadsheetApp.openById(fileList[n]).getSheets();
    for(let i = 0; i < sheets.length; i++) {
     //シート名を出力
      console.log(sheets[i].getName());
    }
  }
}

エラー

Stackoverflowでも質問したが、"Exception: Service Spreadsheets failed while accessing document with id xxxxx" というエラーが出た。上記コードの "const sheets = SpreadsheetApp.openById(fileList[n]).getSheets();" という部分でエラーが発生する。
https://stackoverflow.com/questions/75425957/google-app-script-exception-service-spreadsheets-failed-while-accessing-docum

最近流行りのChatGPTでも質問したが、いずれのケースにも当てはまらない。

  1. ドキュメント ID が正しくない: Google スプレッドシート ドキュメントへのアクセスには正しいドキュメント ID が必要です。ご確認いただき、もう一度お試しいただくことをお勧めします。
  2. アクセス権がない: あなたの Google アカウントには、Google スプレッドシート ドキュメントへのアクセス権が必要です。所有者または共有者として追加されていることを確認してください。
  3. トリガーが設定されていない: Google App Script のコードを実行するには、トリガーが設定されている必要があります。Google スプレッドシート ドキュメントでトリガーを設定し、もう一度お試しください。
  4. API 制限: Google App Script の一部の API には制限があります。制限に達していないかご確認ください。

色々とリサーチしたところ、スプレッドシートがxlsxに変換されていることが原因だった。どういうことかというと、ファイル名の右側に「.XLSX」と書かれているとこういった取得エラーが発生する。今回の場合、フォルダに格納されたファイル全てがXLSX形式だったため、上記エラーが発生した。

対処法

対処法は、単純にXLSX形式のファイルをスプレッドシートに変換することである。下記記事が参考になる。
https://www.teijitaisya.com/gas-excel-to-spreadsheet/

やるべきことは2点。

  • GASプロジェクトにDrive APIサービスを追加すること。App Script画面の左側のサービス追加ボタンから、Drive APIを検索・追加する
  • 変換スクリプトを実行すること。
/*
エクセルファイルをフォルダ単位でまとめてスプレッドシートに変換する。
実行にはDrive APIのサービス追加が必要だよ。
*/
const sourceFolderId = 'フォルダID';
const destFolderId = 'フォルダID';

function myFunction() {
    // Excelファイルが入っているフォルダをidによって取得
    const sourceFolder = DriveApp.getFolderById(sourceFolderId);
    // Excelファイルたちを変数に保存
    const excelFiles   = sourceFolder.getFiles();
    // 変換されたファイルが格納されるフォルダをidによって取得
    const destFolder   = DriveApp.getFolderById(destFolderId);
    // Excelファイルをイテレートして順にスプレッドシートに変換
    while(excelFiles.hasNext()) {
        var file = excelFiles.next();
        convertToSpreadsheet(file, destFolder);
    }
}

function convertToSpreadsheet(file, folder) {
    // 各種オプションを設定
    // mimeTypeをスプレッドシートにする
    options = {
        title: file.getName(),
        mimeType: MimeType.GOOGLE_SHEETS,
        parents: [{id: folder.getId()}]
    };

    // Drive APIへfileをファイルをなげる。
    Drive.Files.insert(options, file.getBlob())
}

引用

https://yizm.work/googleappsscript/gaserror-tiips-「service-spreadsheets-failed-while-accessing」/
https://www.teijitaisya.com/gas-excel-to-spreadsheet/

Discussion