Ruby で Excel ファイルを作成しようとすると ENOENT エラーが発生する

概要

編集2:ディレクトリの問題を解決でき、CSVファイルは問題なく作成されましたが、save_to_xlsxメソッドを使用してファイルをXLSXファイルとしてエクスポートしようとすると、プログラムはファイルをCSVとして保存します。 save_to_xlsx メソッド内で file_format を明示的に変更しました。コードの先頭で file_format を変更すると、初期形式のままで、変更されないように見えることに気付きました。

私のプログラムでは、処理されたデータを CSV または Excel シートとしてエクスポートするかどうかをユーザーが選択し、ファイル名に今日の日付も含めてその形式でファイルを保存できるようにしたいのですが、プログラムを実行すると、どの形式で保存するかを尋ねると、コンソールは「そのようなファイルまたはディレクトリはありません」というエラーを返します。奇妙なのは、このコードが以前は正常に動作していたのに、今日では複数のディレクトリのように見えるものに対してこのエラーがスローされることです。

エラーが発生したコードの部分は次のとおりです。

require 'bundler'
require 'roo'
require 'mail'
require 'date'
require 'csv'
require 'google_drive'
require 'googleauth'
Bundler.require

file_format = 'xlsx'
sheet_id = 'abc123'
local_file_path = "C:\\Users\\zach\\Documents\\Business\\ORDERS\\output.#{file_format}"
csv_file_path = "C:\\Users\\zach\\Documents\\Business\\ORDERS\\output.csv"
file_path = 'C:\Users\zach\Documents\Business\COUNTS\012224 COUNT.xlsx'


def save_to_csv(local_file_path, formatted_data, header)

  CSV.open(local_file_path, 'w') do |csv|
    csv << header
    formatted_data.each_line do |line|
    csv << line.chomp.split("\t")
    end
  end
end

def save_to_xlsx(sheet_id, local_file_path)
  session = GoogleDrive::Session.from_service_account_key("client_secret.json")
  spreadsheet = session.spreadsheet_by_key(sheet_id)

  worksheet = spreadsheet.worksheets.first

  spreadsheet.export_as_file(local_file_path)
  puts "XLSX file has been saved to the following location:\n#{local_file_path}.\n\n"
end

def process_order(sheet_id, file_path, file_format)
  today_date = Date.today.strftime("%m.%d.%Y")
  local_file_path = "C:\\Users\\zach\\Documents\\Business\\ORDERS\\AC_ORDER_#{today_date}.#{file_format}"
  order_details = read_spreadsheet(file_path)
  formatted_data = format_data_plain_text(order_details)
  user_input = 0
  puts "Save as type:\n\n1.) CSV\n\n2.) XLSX"
  user_input = gets.chomp.to_i
  if user_input == 1
    file_format = 'csv'
    save_to_csv(local_file_path, formatted_data, ['AC SKU', 'REORDER QTY'])
  elsif user_input == 2
    file_format = 'xlsx'
    save_to_xlsx(sheet_id, local_file_path)
  else
    puts "invalid selection. Please choose from the available options.\n\n"
    return
  end
  send_email(file_path, local_file_path)
end

以前は実行して保存できたのに、現在は実行できない理由について何か考えはありますか?同じプログラムを使用して生成された同じ出力ディレクトリに、以前の日付のファイルがあるため、何を変更したのか、どこが間違っているのか、非常に混乱しています。あらゆるサポートのための TIA。

編集参考用のスタックトレースは次のとおりです。

C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/csv-3.2.8/lib/csv.rb:1594:in `initialize': No such file or directory @ rb_sysopen - C:\Users\zach\Documents\Business\ORDERS\AC_ORDER_03.12.2024.xlsx (Errno::ENOENT)
        from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/csv-3.2.8/lib/csv.rb:1594:in `open'
        from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/csv-3.2.8/lib/csv.rb:1594:in `open'
        from ex6.rb:44:in `save_to_csv'
        from ex6.rb:72:in `process_order'
        from ex6.rb:118:in `<main>'

解決策

ディレクトリへのパスを再コピーし、最初に local_file_path にあったパスを置き換え、さらに、 process_order メソッドで save_to_xlsx と save_to_csv を呼び出す前に local_file_path 変数を追加することで、プログラムを正常に動作させることができました。問題の一部は、メソッドが local_file_path 引数を使用しているが、メソッドの外で file_format 変数を変更していないことであったと思います。その結果、エクスポートされるファイルは、コードの先頭で初期化された file_format で終わることになります。

コードの一部は次のようになります。

def save_to_csv(local_file_path, formatted_data, header)

  CSV.open(local_file_path, 'w') do |csv|
    csv << header
    formatted_data.each_line do |line|
    csv << line.chomp.split("\t")
    end

    puts "CSV file has been saved to the following location:\n#{local_file_path}.\n\n"
  end
end

def save_to_xlsx(sheet_id, local_file_path)
  session = GoogleDrive::Session.from_service_account_key("client_secret.json")
  spreadsheet = session.spreadsheet_by_key(sheet_id)

  worksheet = spreadsheet.worksheets.first

  spreadsheet.export_as_file(local_file_path)
  puts "XLSX file has been saved to the following location:\n#{local_file_path}.\n\n"
end

def process_order(sheet_id, file_path, file_format, local_file_pat, today_date)
  order_details = read_spreadsheet(file_path)
  formatted_data = format_data_plain_text(order_details)
  user_input = 0
  puts "Save as type:\n\n1.) CSV\n\n2.) XLSX"
  user_input = gets.chomp.to_i
  if user_input == 1
    file_format = 'csv'
    local_file_path = "C:\\Users\\zach\\Documents\\Business\\ORDERS\\AC_ORDER_#{today_date}.#{file_format}"
    save_to_csv(local_file_path, formatted_data, ['AC SKU', 'REORDER QTY'])
  elsif user_input == 2
    file_format = 'xlsx'
    local_file_path = "C:\\Users\\zach\\Documents\\Business\\ORDERS\\AC_ORDER_#{today_date}.#{file_format}"
    save_to_xlsx(sheet_id, local_file_path)
  else
    puts "invalid selection. Please choose from the available options.\n\n"
    return
  end