Rails에서 스프레드시트를 정기적으로 다시 작성

9674 단어 Railsspreadsheet

소개



서비스의 KPI 등을 스프레드 시트로 관리하는 것이 많다고는 생각합니다만, 매회 데이터 취해 스프레드 시트에 기입해, 를 하고 있으면 뭐 그렇게 시간의 낭비이므로 Rails 앱으로부터 직접 스프레드시트 시트에 기입하도록 했습니다.
게다가 KPI의 계측이므로 매일 아침 데이터를 갱신할 수 있도록 배치도 짜도록(듯이) 했습니다.

이번에는 다음을 사용하고 있습니다.
  • Rails 5.2
  • gem 'google_drive'

  • 구현



    만드는 것



    Rails 데이터베이스에서 당월 회원 가입한 사용자 수를 일별로 취득하도록 합니다.
    사용자는 User 모델입니다.

    자격 증명 얻기



    API를 통해 스프레드시트를 편집하려면 자격 증명이 필요하므로 Google Developers Console에서 정보를 가져옵니다.

    프로젝트 만들기



    는 프로젝트를 만듭니다.



    API 사용



    그런 다음 라이브러리에서 스프레드시트를 검색하고 활성화하여 스프레드시트 API 사용을 활성화합니다.



    자격 증명 만들기



    우선은 OAuth 동의 화면에서 조작합니다. 응용 프로그램 등을 채우고 저장합니다.


    계속해서 OAuth 클라이언트를 작성해 갑니다.



    작성한 클라이언트 목록에서 이름을 클릭하여 클라이언트 ID와 클라이언트 비밀을 확인할 수 있습니다.


    새로 고침 토큰 얻기



    계속해서 방금 작성한 클라이언트의 정보를 바탕으로 리프레시 토큰을 취득합니다.
    쓰기의 번거롭게 되어 버렸으므로 이쪽의 방법은 이 기사 를 참고로 해 봐 주세요.

    Rails 측 구현



    이번에는 여러가지 처리를 작업 속에 써 갑니다.

    Google API를 이번 처리 이외에도 사용할 가능성을 가미하여 ApplicationJob 에 API 인증 처리를 작성하여 다른 작업에서도 호출할 수 있도록 했습니다. (사용 가능성을 가미해라고 할까, 나의 경우는 복수 사용하고 있기 때문에)

    app/jobs/application_job.rb
    class ApplicationJob < ActiveJob::Base
    
      def google_drive
        credentials = Google::Auth::UserRefreshCredentials.new(
          client_id: ENV['KPI_SHEET_CLIENT_ID'],
          client_secret: ENV['KPI_SHEET_CLIENT_SECRET'],
          scope: %w(https://www.googleapis.com/auth/drive https://spreadsheets.google.com/feeds/),
          redirect_uri: 'http://storys.jp'
        )
        credentials.refresh_token = ENV['KPI_SHEET_REFRESH_TOKEN']
        credentials.fetch_access_token!
        GoogleDrive::Session.from_credentials(credentials)
      end
    end
    

    실제로 스프레드시트에 쓰는 과정은 다음과 같습니다.ws[1, 1] 는 시트의 1행째의 1열째, ws[1, 2] 는 1행째의 2열째입니다.
    마찬가지로 ws[2, 1] 는 두 번째 행의 첫 번째 열입니다.

    app/jobs/export_kpi_job.rb
    class ExportKpiJob < ApplicationJob
    
      def perform
        spreadsheet = google_drive.spreadsheet_by_key('スプレッドシートのキー')
        ws = spreadsheet.worksheet_by_title('該当のシートの名前')
    
        ws[1, 1] = ''
        ws[1, 2] = '新規登録ユーザー数'
    
        current_date = Date.current
        beginning_day_of_month = current_date.beginning_of_month
        end_day_of_month = current_date.end_of_month
    
        (beginning_day_of_month..end_day_of_month).each.with_index(2) do |date|
          ws[index, 1] = date
          ws[index, 2] = Users.where(created_at: date.beginning_of_day..date.end_of_month)
        end
    
        ws.save
      end
    end
    

    정시 처리 설정



    정시 처리에는 gem 'whenever' 를 사용합니다.
    whenever 자체의 사용법은 이쪽을 참고해 주세요.

    우선 작업 만들기

    lib/tasks/rails_sample.rake
    namespace :rails_sample do
      desc 'KPIをスプレッドシートに吐き出す'
      task :export_kpi => :environment do
        ExportKpiJob.perform_now
      end
    end
    

    이번에는 매일 아침 4시에 태스크가 달리도록 합니다.

    config/schedule.rb
    every 1.day, at: '4:00 am', role: [:app] do
      rake 'rails_sample:export_kpi'
    end
    

    요약



    이상으로 Rails로부터 스프레드 시트를 정시에 재기록할 수 있었습니다.
    이런 작은 자동화를 포함해, 자신은 물론 다른 사람의 일의 효율을 올려 주는 것이 엔지니어가 할 수 있는 공헌의 하나인가라고 생각하기 때문에 앞으로도 계속하고 싶은 소존.

    좋은 웹페이지 즐겨찾기