Ruby调用Google Sheets遇类型错误及邮件附件发送问题求助
编辑说明 - 我重新添加了注释掉的代码段,以便展示我尝试过的其他解决方法,希望能更清晰地说明我的处理流程。目前程序可以运行,但它发送的是本地表格作为附件,而不是我需要从Google Sheets生成并附加的临时文件,这正是我遇到的问题所在,我需要知道如何调整代码来下载并附加包含处理后数据的临时文件...
Ruby操作Google Sheets下载并邮件附件报错及功能异常问题
我在Ruby程序中尝试下载Google Sheets文件并作为邮件附件发送时遇到了问题。该程序的预期功能是:读取本地表格中的补货数量数据,写入到Google Sheets中,随后将该Google Sheets文件下载并作为附件发送邮件。目前我可以实现将对应SKU和数量以文本形式放在邮件正文中发送,也能将SKU和数量写入指定的Google Sheets,但无法完成下载该表格并作为附件发送的操作。我遇到的具体错误如下:
C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/signet-0.18.0/lib/signet/oauth_2/client.rb:420:in `scope=': Expected Array or String, got Hash (TypeError) raise TypeError, "Expected Array or String, got #{new_scope.class}" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/signet-0.18.0/lib/signet/oauth_2/client.rb:193:in `update!' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/signet-0.18.0/lib/signet/oauth_2/client.rb:115:in `initialize' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/googleauth-0.17.1/lib/googleauth/service_account.rb:105:in `initialize' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/googleauth-0.17.1/lib/googleauth/service_account.rb:80:in `new' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/googleauth-0.17.1/lib/googleauth/service_account.rb:80:in `make_creds' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/google_drive-3.0.7/lib/google_drive/session.rb:89:in `from_service_account_key' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/google_drive-3.0.7/lib/google_drive/session.rb:86:in `block in from_service_account_key' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/google_drive-3.0.7/lib/google_drive/session.rb:85:in `open' from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/google_drive-3.0.7/lib/google_drive/session.rb:85:in `from_service_account_key' from ex5.rb:38:in `insert_data' from ex5.rb:83:in `process_order' from ex5.rb:144:in `<main>'
请帮忙检查我的代码,指出我哪里出错了?
require 'bundler' require 'google_drive' require 'roo' require 'google/apis/sheets_v4' require 'googleauth' require 'googleauth/stores/file_token_store' require 'mail' Bundler.require begin def read_spreadsheet(file_path) spreadsheet = Roo::Excelx.new(file_path) header = spreadsheet.row(2) data = [] (3..spreadsheet.last_row).each do |i| row = Hash[[header, spreadsheet.row(i)].transpose] data << row end data end def format_data_plain_text(data) formatted_data = "" data.each do |row| unless row['REORDER QTY'].to_i.zero? || row['AC SKU'].to_s.empty? sku = row['AC SKU'].to_s quantity = row['REORDER QTY'].to_s formatted_data += "#{sku}\t#{quantity}\n" end end formatted_data.to_s end def insert_data(file_path, formatted_data) session = GoogleDrive::Session.from_service_account_key("client_secret.json") spreadsheet_title = "Reorder Details" spreadsheet = session.spreadsheet_by_title(spreadsheet_title) worksheet = spreadsheet.worksheets.first first_empty_row = 1 while !worksheet[first_empty_row, 1].empty? && first_empty_row <= worksheet.num_rows first_empty_row += 1 end if first_empty_row == 1 worksheet[first_empty_row, 1] = "SKU" worksheet[first_empty_row, 2] = "QUANTITY" first_empty_row += 1 end puts formatted_data.class data_lines = formatted_data.split("\n") data_lines.each_with_index do |line, index| columns = line.split("\t") worksheet[first_empty_row + index, 1] = columns[0] worksheet[first_empty_row + index, 2] = columns[1] end worksheet.save end def download_google_sheet(sheet_id) session = GoogleDrive::Session.from_service_account_key("client_secret.json") spreadsheet = session.spreadsheet_by_key(sheet_id) worksheet = spreadsheet.worksheets.first temp_file = Tempfile.new(['google_sheet', '.xlsx'], encoding: 'UTF-8') worksheet.export_as_file(temp_file.path) temp_file.path temp_file.close end def process_order(file_path) order_details = read_spreadsheet(file_path) formatted_data = format_data_plain_text(order_details) insert_data(file_path, formatted_data) puts "Data inserted into Google Sheets." sheet_id = 'numbersandletters' temp_file_path = download_google_sheet(sheet_id) send_email(file_path, temp_file_path) end def send_email(file_path, temp_file_path) # Configure your email settings options = { address: 'smtp.gmail.com', port: 587, user_name: 'email@email.com', password: 'password', domain: 'domain.com', authentication: 'plain', enable_starttls_auto: true } Mail.defaults do delivery_method :smtp, options end order_details = read_spreadsheet(file_path) formatted_data = format_data_plain_text(order_details) #temp_file_content = File.read(temp_file_path) #Specify the email content mail = Mail.new do from 'Email@email.com' to 'email@email.com' subject "Order Details:" body "Hey Tim. Hope you're doing well! I just need to place an order for the following items:\n\nThis will be using Net Terms.\n\nPlease let me know if you need anything else from me! Have a great week!" add_file(file_path) end # Send the email mail.deliver! end #def send_email(file_path) # gmail = Gmail.connect("email@email.com", "password") # subject = "Reorder Details" # body = "Please find the attached Google Sheet with reorder details." # gmail.deliver do # to "email@email.com" # subject subject # text_part do # body body # end # add_file file_path # end # gmail.logout #end file_path = 'path\\to\\file' process_order(file_path) #def export_google_sheet(file_id, export_format, export_directory) # session = GoogleDrive::Session.from_service_account_key('path\\to\\cliet_secret.json') # spreadsheet = session.file_by_id(file_id) # export_filename = "AC_Order_#{Time.now.strftime('%Y-%m-%d')}.#{export_format.split('/').last}" # export_path = File.join(export_directory, export_filename) # spreadsheet.export_as_file(export_format, export_path) # puts "File exported to: #{export_path}" #end #file_id = 'randomnumbersandletters' #export_format = 'pdf' #export_directory = '\\path\\to\\export' #export_google_sheet(file_id, export_format, export_directory) end
我曾尝试在format_data_plain_text方法末尾添加format_data.to_s确保数据转为字符串,也尝试过添加temp_file_content = File.read(temp_file_path),但无论做这些修改,仍会返回相同的错误。
内容的提问来源于stack exchange,提问作者Zach S
相关产品推荐
相关产品推荐

