You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails定时Feed后台任务:每2天导出CSV至Google Drive方案咨询

我刚好做过类似的需求,给你一套完整的可落地实现方案,一步步来确保能跑通:

完整实现方案

核心思路是:用Heroku Scheduler触发Rake任务,任务中生成指定格式的CSV,再通过Google Drive API上传到指定文件夹。

步骤1:配置Google Drive API权限

首先得让你的Rails应用能合法访问Google Drive:

  1. 登录Google Cloud Console,创建一个新项目(或用现有项目)
  2. 搜索并启用「Google Drive API」
  3. 进入「IAM与管理」→「服务账号」,创建一个新的服务账号,给它起个名字比如rails-drive-exporter
  4. 给这个服务账号生成密钥:点击服务账号→「密钥」→「添加密钥」→「创建新密钥」,选择JSON格式,下载密钥文件(保存好,后面要用)
  5. 打开你的Google Drive,创建一个专门存储导出文件的文件夹,右键「共享」,把服务账号的邮箱(就是刚才创建服务账号时生成的那个类似xxx@xxx.iam.gserviceaccount.com的邮箱)添加为编辑者

步骤2:添加必要的Gem

在你的Gemfile里加入两个关键Gem:

# 用于操作Google Drive
gem 'google-drive-ruby'
# 本地开发时管理环境变量(Heroku用自带的config vars)
gem 'dotenv-rails', groups: [:development, :test]

然后执行bundle install安装。

步骤3:编写CSV生成逻辑

建议用服务类来封装导出逻辑,这样代码更清晰易维护。在app/services下创建sales_export_service.rb:

class SalesExportService
  # 生成符合要求的CSV内容
  def self.generate_csv
    # 替换成你需要的特定表头
    custom_headers = ["客户ID", "姓名", "联系邮箱", "跟进状态", "创建日期"]
    
    # 替换成你的业务查询逻辑,比如筛选需要导出的销售相关记录
    target_records = Customer.where(needs_export: true) # 这里改成你的模型和条件
    
    # 生成CSV字符串(Rails自带CSV库,无需额外依赖)
    CSV.generate(headers: true, encoding: 'UTF-8') do |csv|
      csv << custom_headers
      target_records.each do |record|
        # 按表头顺序填入对应字段,替换成你的模型属性
        csv << [
          record.id,
          record.full_name,
          record.contact_email,
          record.follow_up_status,
          record.created_at.strftime("%Y-%m-%d")
        ]
      end
    end
  end
end

步骤4:编写定时执行的Rake任务

在lib/tasks下创建sales_export.rake文件,定义触发导出并上传的任务:

namespace :sales do
  desc "自动导出销售数据到Google Drive"
  task export_to_drive: :environment do
    require 'google_drive'
    
    begin
      # 1. 生成CSV内容
      csv_content = SalesExportService.generate_csv
      
      # 2. 初始化Google Drive会话(用环境变量里的密钥)
      drive_session = GoogleDrive::Session.from_service_account_key(
        JSON.parse(ENV['GOOGLE_DRIVE_SERVICE_ACCOUNT_KEY'])
      )
      
      # 3. 获取目标文件夹(用环境变量存文件夹ID)
      target_folder = drive_session.file_by_id(ENV['GOOGLE_DRIVE_TARGET_FOLDER_ID'])
      
      # 4. 生成带时间戳的文件名,避免覆盖
      timestamp = Time.now.strftime("%Y%m%d_%H%M%S")
      file_name = "销售数据导出_#{timestamp}.csv"
      
      # 5. 上传CSV文件到Drive
      uploaded_file = target_folder.create_file(
        file_name,
        content: csv_content,
        content_type: 'text/csv'
      )
      
      Rails.logger.info "✅ 成功导出文件:#{file_name},Drive文件ID:#{uploaded_file.id}"
    rescue StandardError => e
      # 异常处理:记录错误日志,建议添加邮件通知或异常监控
      Rails.logger.error "❌ 销售数据导出失败:#{e.message}\n#{e.backtrace.join("\n")}"
      # 可选:用Action Mailer给管理员发失败通知
      # AdminMailer.sales_export_failure_notice(e).deliver_later
      raise e # 让Heroku Scheduler记录失败状态
    end
  end
end

步骤5:配置Heroku环境变量

登录Heroku控制台,找到你的应用,进入「Settings」→「Config Vars」,添加两个变量:

  • GOOGLE_DRIVE_SERVICE_ACCOUNT_KEY:把之前下载的JSON密钥文件内容复制进去(注意是纯字符串,不要带换行)
  • GOOGLE_DRIVE_TARGET_FOLDER_ID:目标Drive文件夹的ID(从文件夹URL里取,比如https://drive.google.com/drive/folders/xxxxxx里的xxxxxx)

步骤6:设置Heroku Scheduler定时任务

  1. 在Heroku控制台搜索并安装「Scheduler」插件(如果没装的话)
  2. 打开Scheduler,点击「Add job」
  3. 配置:
    • Frequency:选择「Every 2 days」
    • Command:填入rails sales:export_to_drive
    • Dyno size:选「Free」就够(如果数据量特别大可以选Hobby)
  4. 保存任务即可

额外注意事项

  • 本地测试:先在本地执行bundle exec rake sales:export_to_drive,确认能生成CSV并上传到Drive
  • 性能优化:如果导出数据量很大,把target_records.each改成target_records.find_each(batch_size: 1000),避免内存溢出
  • 权限检查:确保服务账号确实有目标文件夹的编辑权限,不然会上传失败
  • 日志查看:Heroku Scheduler的执行日志可以在应用的「Logs」里查看,方便排查问题

内容的提问来源于stack exchange,提问作者Saurav Prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:03