🙄

【iOS】GoogleスプレッドシートとFastlaneを使って、App Store説明文を自動更新してラクする手順を書いてみる。

7 min read

大変なことはなるだけ機械に任せたい。

当たり前ですが、iOSアプリを更新するにはアップデートの内容文なども更新する必要があります。

これまで自分は、運営さんがGoogleスプレッドシートに入力してくれた説明文を、一個一個、App Store Connectにコピー&ペーストしていました。

たまになら問題ないですが、多くなってくるとちと大変です。自動化してラクしたい。ラクしたい。ラクできた!

というわけで、うまく行ったので、GoogleスプレッドシートとFastlaneを使ってApp Store説明文の更新を自動化する手順を書いておきます。

1. 用意するもの

2. App Store説明文を入力したGoogleスプレッドシートを作る

今回は、この内容のスプレッドシートからApp Storeの文言を取得する例として書きます。

言語別にシートは分けてください(シート名は、日本語は「ja」、英語は「en-US」とします)

日本語

アプリ名 サブタイトル プロモーション 詳細 アップデート内容 キーワード
全自動肩揉み機 血流改善にどうぞ ぜひ使ってください。 これはとても健康的なアプリです。 軽微な修正を施しました 全自動、 マッスィーン

英語

アプリ名 サブタイトル プロモーション 詳細 アップデート内容 キーワード
Full Auto Shoulder massager Please improve blood flow. Please use it. It's a very healthy app. bugfix Full Auto、 Let's

3. Google Cloud Platformで「Google Drive API」と「Google Spreadsheet API」を使えるように設定する

Googleスプレッドシートから文言を取得するには「Google Drive API」と「Google SpreadSheet API」を叩く必要があります。

そして、これらのAPIをCIから叩くには、GCPでサービスアカウントを作成する必要があります。

  1. Google Cloud Platform にアクセスしてプロジェクトを作りましょう。

  2. APIとサービス>認証情報に移動して「認証情報を作成」をクリックし、サービスアカウントをクリックします。

  3. 名前、ID、サービスアカウントの説明を記入して、作成ボタンをクリックします。

  4. サービスアカウントの権限を決めます。今回、Googleスプレッドシートを読み込たいので閲覧者に(適時、適切な権限を選んでください)して続行ボタンをクリックします。

  5. 完了ボタンをクリックします。

  6. サービスアカウントの欄に新たな項目が追加されるのでクリックします。

  7. 鍵を追加をクリックして、新しい鍵の作成をクリックします。

  8. JSONを指定して作成をクリックします。
    保存したJSONファイルは、config.jsonにリネームしてください。

あとは、APIサービス > APIライブラリから「Google Drive API」と「Google Spreadsheet API」にを検索し、それぞれのAPIを有効にすれば設定は完了です。

4. 独自Fastlane Actionを作る

Fastfileに書いてしまっても良いのですが、Fastfileを肥大化させないためにも、独自Actionを作って処理を分けます。

以下のコマンドを叩きます。

bundle exec fastlane new action

名前を聞かれるので適当な名前を当てます。 metadata とでもしておきましょうか。

[20:28:11]: Name of your action: metadata

fastlane/action/metadata.rb というファイルが生成されます。

5. 「google-drive-Ruby」を使って、GoogleスプレッドシートからApp Store説明文を読み込む

下準備

Googleスプレッドシートを読み込むために、google-drive-rubyというgemを使います。

Gemfile に以下を追加します。

gem "google_drive"

インストール。

bundle install

fastlane/action/ に先ほどGoogle Cloud Platformで生成したサービスアカウントキー(config.json)を置きます(サービスアカウントキーを置きたくない方はここへジャンプ

コードを書く

fastlane/action/metadata.rb の先頭に、以下を追加します。

require "google_drive"

self.run(params) に以下のコードを書いていきます。
冒頭に書いたスプレッドシートの内容を以下の定数に指定します。

LANGUAGES = ["ja", "en-US"]
COLUMNS = ["name", "subtitle", "promotional_text", "description", "release_notes", "keywords"]

サービスアカウントキーファイルのパスとスプレッドシートIDを指定して、スプレッドシートを読み込みます。

session = GoogleDrive::Session.from_config("config.json")
spreadsheet = session.spreadsheet_by_key("スプレッドシートのID")

あとは、各言語別のシートの最終行から各カラムごとのテキストを引っ張って、各テキストファイルに保存するだけ。

LANGUAGES.each do |language|
  spreadsheet.worksheet_by_title(language).rows.last.each_with_index do |text, i|
    File.open("#{FastlaneCore::FastlaneFolder.path}metadata/#{language}/#{COLUMNS[i]}.txt", mode = "wb") do |f| f.write(text) end
  end
end

コード全文

require "google_drive"

module Fastlane
  module Actions
    class MetadataAction < Action
      def self.run(params)
        LANGUAGES = ["ja", "en-US"]
        COLUMNS = ["name", "subtitle", "promotional_text", "description", "release_notes", "keywords"]

        session = GoogleDrive::Session.from_config("config.json")
        spreadsheet = session.spreadsheet_by_key("スプレッドシートのID")

        LANGUAGES.each do |language|
          spreadsheet.worksheet_by_title(language).rows.last.each_with_index do |text, i|
            File.open("#{FastlaneCore::FastlaneFolder.path}metadata/#{language}/#{COLUMNS[i]}.txt", mode = "wb") do |f| f.write(text) end
          end
        end
      end

      def self.description
        "A short description with <= 80 characters of what this action does"
      end

      def self.details
        "You can use this action to do cool things..."
      end

      def self.available_options
        []
      end

      def self.authors
        ["Your GitHub/Twitter Name"]
      end

      def self.is_supported?(platform)
        platform == :ios
      end
    end
  end
end

6. Fastfileで実行

あとは、Fastfile上でmetadataを実行すれば、各テキストファイルにGoogleスプレッドシートから読み込んだ項目を保存します。

その次に、deliver(skip_metadata: false) を実行すればApp Storeの説明文を更新してくれます。

lane :deploy_appstore do
  metadata
  deliver(skip_metadata: false)
end

ちなみに、diffが出たらプルリクエストを作るようにすれば、前のバージョンの違いが一目瞭然となるのでおすすめです。

7. Fastlane Pluginにして公開してみた

ここまで説明して何ですが、Fastlane Pluginにしてみました。

他にも同じ目的のプラグインはありましたが、 これは、サービスアカウントキーファイルをGit管理したくなかったので環境変数で指定できるようにしています。 あと、deliverがmetadata更新に使用していないテキストファイル名をcolumsに指定すれば、そこのカラムは無視する様にもしています。

こんな感じで使えます。

fetch_metadata_from_google_sheets(
  languages: ["ja", "en-US"],
  columns: ["version", "name", "subtitle", "release_notes", "promotional_text", "description", "keywords"],
  spreadsheet_id: ENV["TEST_APP_STORE_METADATA_SPREADSHEET_ID"],
  project_id: ENV["TEST_GCP_PROJECT_ID"],
  service_account_private_key_id: ENV["TEST_GCP_SERVICE_ACCOUNT_PRIVATE_KEY_ID"],
  service_account_private_key: ENV["TEST_GCP_SERVICE_ACCOUNT_PRIVATE_KEY"],
  service_account_client_email: ENV["TEST_GCP_SERVICE_ACCOUNT_CLIENT_EMAIL"],
  service_account_client_id: ENV["TEST_GCP_SERVICE_ACCOUNT_CLIENT_ID"],
  service_account_auth_uri: ENV["TEST_GCP_SERVICE_ACCOUNT_AUTH_URI"],
  service_account_token_uri: ENV["TEST_GCP_SERVICE_ACCOUNT_TOKEN_URI"],
  service_account_auth_provider_x509_cert_url: ENV["TEST_GCP_SERVICE_ACCOUNT_AUTH_PROVIDER_X509_CERT_URL"],
  service_account_client_x509_cert_url: ENV["TEST_GCP_SERVICE_ACCOUNT_CLIENT_X509_CERT_URL"]
)

詳しくは、以下のリボジトリを参考にしてください。

https://github.com/kurarararara/fastlane-plugin-fetch_metadata_from_google_sheets

8. さいごに

これまでは、コピー&ペーストする度に間違いがないかハラハラしてましたが、自動更新してからは間違うこともなく随分ラクになりました。

ぜひ、同じくお困りの方はお試しください。

こんな記事もどうぞ。

GASでQiita APIを叩いて結果をGoogleスプレッドシートに自動入力する手順を詳しくメモしておく