1

我创建了一个 rake 任务来从 Google 表格中导入用户。因此我使用宝石' Roo '。到目前为止一切正常,但如果不导入第一行(标题),我似乎无法让它工作。

这是我的代码:

require 'roo'

namespace :import do
  desc "Import users from Google Sheet"
  task users: :environment do

    @counter = 0
    url = 'https://docs.google.com/spreadsheets/d/{mycode}/export?format=xlsx'
    xlsx = Roo::Spreadsheet.open(url, extension: :xlsx, headers: true)
    xlsx.each do |row|
        n = User.where(name:row[0]).first
        user = User.find_or_create_by(id: n)
        user.update(
                     name:row[0],
                     country_id:row[6]
                   )
        user.save!
        puts user.name
        @counter += 1
      end
     puts "Imported #{@counter} lines."
    end
end
4

2 回答 2

1

您的代码headers: true在您打开工作表时显示。你试过把它变成假的吗?或者你是说当它设置为false时它不起作用?

此外,您使用.each的方式与文档中的示例完全不同。该文档显示了带有从标头派生的键的散列。您正在使用[n]数组表示法。那样有用吗?

编辑:

尝试以.each更类似于文档所述的方式使用:

xlsx.each(name: 'Name', country_id: 'Country ID') do |row|
  n = User.where(name: row[:name]).first
  ...
end

字符串 'Name' 和 'Country ID' 只是示例;它们应该是具有名称和 country_id 信息的任何列标题的文本。

于 2018-09-13T17:53:32.350 回答
0

有一种方法可以跳过标题,它使用方法:each_row_streaming(offset: 1).

它将返回一个带有跳过标题行的数组,因此您必须使用.value方法获取值。在文档中为对象指定它Excelx::Cell,但它也适用于Roo::Spreadsheet对象。文档示例:

xlsx.each_row_streaming(offset: 1) do |row| # Will exclude first (inevitably header) row
  puts row.inspect # Array of Excelx::Cell objects
end
于 2020-01-20T12:29:51.700 回答