3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AtraeAdvent Calendar 2017

Day 24

【Sales Hack!!】Google Spreadsheet API v4を使ってテレアポのリストを作る

Posted at

はじめに

(空想)
僕のチームの新卒1年目の営業マン「通称 今坂くん」が、メールで企業からアポイントメントを取ろうと頑張っています。問い合わせフォームから素敵な案内メールを送っているようですが、返信はほとんどありません。

リード顧客からメールを送れば、開封やクリックリストは作れるけど、問い合わせフォームからの案内だと、クリックリストは作れません。

悩める坊やは、途方にくれていました。

0930tobidashi5.png

今回は悩める坊や「今坂くん」の為に、クリックリストをGoogleのスプレッドシートを使って作ります。

まずは諸々設定

Ruby Quickstartを見ればほとんどつまらずに作れます。

developerツールにアクセスし、プロジェクトの作成や、ClientIDを作りましょう。

googleconsole.png

こんな感じにアカウントを作成し、secret-key等が記載されたjsonをDLできればOK!

jsonの中に記載されたclient_emailをGoogleのspreadSheetの共有設定で、共有しましょう。

スプレッドシート.png

これでOK!

##プログラムを書きましょう

Gemをインストール。

gem 'google-api-client'

認証→書き込みをまとめたClassを作成。

class GoogleSpreadsheet
  RANGE = 'A1:C4000'
  SCOPES = [Google::Apis::SheetsV4::AUTH_SPREADSHEETS]

  # ここで認証しておく
  def initialize(sheet_id, file_path)
    @sheet_id = sheet_id
    authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: File.open(file_path),
      scope: SCOPES)
    authorizer.fetch_access_token!
    @service = Google::Apis::SheetsV4::SheetsService.new
    @service.authorization = authorizer
  end

  # スプレッドシートの中身を取ってくる
  def columns
    @service.batch_get_spreadsheet_values(@sheet_id, ranges: RANGE).value_ranges.first.values
  end

  # スプレッドシートに書き込む
  def write(id, url="")
    value_range = Google::Apis::SheetsV4::ValueRange.new
    writed_size = columns.size
    value_range.range = "A#{writed_size+1}:C#{writed_size+1}"
    value_range.major_dimension = 'ROWS'
    value_range.values = [[id, Date.today.strftime('%Y-%m-%d'), url]]
    @service.update_spreadsheet_value(
      @sheet_id, 
      value_range.range,
      value_range,
      value_input_option: 'USER_ENTERED',
    )
  end
end

書き込みは常に最後の行に追加したいので、

writed_size = columns.size
value_range.range = "A#{writed_size+1}:C#{writed_size+1}"

サイズを取ってきて、+1する形で設定しております。

class ApisController < ApplicationController
  def write_to_imasaka_sheet
    gs = GoogleSpreadsheet.new(
      CONFIG['gs']['id'],
      CONFIG['gs']['file_path']
    )
    gs.write(params[:id], params[:url])
  end
end

今後も色々なシートを使う事を踏まえると、書き込み側でシートのIDや、jsonのpathは指定します。

ちなみにシートのIDはこちらです。
ID.png

フックはjs側で作ります。
例えば、リンクに「imasaka_mail=123」というパラメータが入っているとリストに追加するとかが良いですね。他のものと混ざりませんし。

var params = new Object;
var pair = location.search.substring(1).split('&');
for(var i=0; pair[i]; i++) {
  var kv = pair[i].split('=');
  params[kv[0]]=kv[1];
}

if(params['imasaka_mail'] !== undefined && params['imasaka_mail'] !== null) {
  $.get("/apis/write_to_imasaka_sheet", { 
    mcid: params['imasaka_mail'], url: $(location).attr('pathname') 
  });
}

最近はすっかりReactになっているので、JQueryを書くのは久しぶりですね。

##結果

スクリーンショット 2017-12-24 23.42.07.png

問い合わせフォームから連絡する際も、きちんとメールにIDをつけておけば、自動的にシートに書き込まれるようになりました。これで「今坂くん」の素敵な案内が見られたかどうかわかりますね。

スクリーンショット 2017-12-24 23.43.53.png

今坂くんもさぞかし喜んでいます。
皆様年末は大変事故が起きやすくなっておりますので、くれぐれも飛び出しはしないように気をつけてくださいね。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?