【GAS】二次元配列をCSVファイルに出力する関数

以下のマクロを、Google Apps Script (GAS)に変換しました。

/**
 * 二次元配列をCSVファイルに出力する関数
 * @param {Array} arr - 出力する二次元配列(データ)
 * @param {string} fileName - 保存先のCSVファイル名(Drive上のパスを指定)
 * @param {string} [delimiter='Comma'] - 区切り文字。'Comma'(カンマ区切り)または 'Tab'(タブ区切り)
 */
function arrayToCSV(arr, fileName, delimiter = 'Comma') {
  // Google Drive内のファイルパスを取得
  const file = DriveApp.getFilesByName(fileName);

  // ファイルが存在する場合、削除する
  if (file.hasNext()) {
    const existingFile = file.next();
    if (existingFile.isTrashed() === false) {
      const userResponse = Browser.msgBox('ファイルがすでに存在します。',
        'ファイルがすでに存在します。削除して新しく作成しますか?\n\n' +
        'OK: ファイルを削除して続行します\nキャンセル: 処理を中止します',
        Browser.Buttons.OK_CANCEL);

      if (userResponse === 'cancel') {
        return; // ユーザーが「キャンセル」を選んだ場合、処理を終了
      }

      // ファイルが開かれていない場合のみ削除
      existingFile.setTrashed(true); // 既存のファイルをゴミ箱に移動
    }
  }

  // 新規CSVファイルを作成
  const csvData = convertArrayToCSV(arr, delimiter);

  // 新しいCSVファイルをDriveに保存
  const newFile = DriveApp.createFile(fileName, csvData, MimeType.PLAIN_TEXT);
  Logger.log('CSVファイルが作成されました: ' + newFile.getUrl());
}

/**
 * 配列をCSV形式の文字列に変換する関数
 * @param {Array} arr - 二次元配列(データ)
 * @param {string} delimiter - 区切り文字 ('Comma' または 'Tab')
 * @returns {string} - CSV形式に変換された文字列
 */
function convertArrayToCSV(arr, delimiter) {
  const delimiterChar = (delimiter.toLowerCase() === 'tab') ? '\t' : ',';
  let csvStr = '';

  // 配列の各行をCSV形式で結合
  for (let i = 0; i < arr.length; i++) {
    let row = arr[i].map(cell => {
      // 各セルが文字列に変換されるように
      return '"' + (cell !== undefined ? cell.toString() : '') + '"';
    }).join(delimiterChar);

    csvStr += row + '\n';  // 各行を改行で区切る
  }

  return csvStr;
}

/**
 * ファイルが開いているかどうかを確認する関数(GASでは実装が難しいが、代替案)
 * @param {string} filePath - ファイルのパス
 * @returns {boolean} - ファイルが開かれていれば true, そうでなければ false
 */
function isBookOpened(filePath) {
  try {
    // Google Drive APIの操作にはファイルが開かれているかどうかを直接判別する方法はない
    // 代替案として、ファイルがゴミ箱に入っているかどうかをチェック
    const file = DriveApp.getFilesByName(filePath);
    return file.hasNext();
  } catch (e) {
    return false;
  }
}

変換のポイント

  1. ファイル操作(ファイルの存在確認と削除)
    • VBA では FileSystemObject を使ってファイルの存在を確認し、削除していましたが、GAS では DriveApp を使います。
    • DriveApp.getFilesByName(fileName) を使ってファイルを検索し、ファイルが存在する場合には削除(ゴミ箱に移動)します。
  2. CSVへの書き出し
    • 配列を直接シートに書き出すVBAとは異なり、GASでは配列を文字列に変換して、Google Driveに保存する形になります。
    • 文字列化した配列を createFile() メソッドでGoogle Driveに保存します。
  3. 区切り文字の対応
    • 区切り文字(カンマまたはタブ)に応じて、出力を変えるために convertArrayToCSV 関数で区切り文字を変えます。
  4. ファイルが開かれているかの確認
    • VBA の IsBookOpened 関数はファイルが開いているかどうかを確認するもので、GAS では直接的にそのチェックを行うことはできませんが、代替的にファイルが存在するかをチェックするロジックを使用しています。

使用方法

  1. Google Apps Script エディタで新しいスクリプトを作成します。
  2. 上記コードをコピペして貼り付けます。
  3. arrayToCSV 関数を呼び出して、二次元配列データを指定のファイル名で保存します。

使用例

function testArrayToCSV() {
  // 例として、2次元配列を作成
  const data = [
    ['名前', '年齢', '職業'],
    ['佐藤', '30', 'エンジニア'],
    ['鈴木', '25', 'デザイナー'],
    ['田中', '35', 'マネージャー']
  ];

  // CSVファイルを保存
  arrayToCSV(data, 'test.csv', 'Comma');
}

上記の例では、Google Drive に test.csv ファイルが作成され、カンマ区切りで保存されます。

Follow me!