[RUBY] Comment mettre à jour automatiquement la description de l'App Store dans Google Spreadsheets et Fastlane

** Je veux laisser les choses difficiles à la machine autant que possible. ** **

Évidemment, pour mettre à jour l'application iOS, il est également nécessaire de mettre à jour le contenu de la mise à jour.

Jusqu'à présent, j'avais l'habitude de copier et coller le libellé de l'application que l'opérateur avait entré dans la feuille de calcul Google dans l'App Store Connect un par un.

Parfois, il n'y a pas de problème, mais à mesure que le nombre augmente, cela devient difficile. Je veux automatiser et faciliter les choses. Je veux faciliter les choses. C'était facile!

Donc, cela a fonctionné, ** Je vais écrire une procédure pour automatiser la mise à jour de la description de l'App Store à l'aide de Google Spreadsheet et Fastlane. ** **

1. Quoi préparer

2. Créez une feuille de calcul Google avec la description de l'App Store

Cette fois, je vais l'écrire comme exemple pour obtenir le libellé de l'App Store à partir de la feuille de calcul avec ce contenu.

Feuilles séparées par langue (les noms de feuille sont "ja" pour le japonais et "en-US" pour l'anglais)

Japonais

nom de l'application Sous-titre promotion Détails Mettre à jour le contenu mot-clé
Masseur d'épaule entièrement automatique Veuillez améliorer la circulation sanguine Veuillez l'utiliser. Ceci est une application très saine. Des corrections mineures ont été apportées Entièrement automatique, Massine

Anglais

nom de l'application Sous-titre promotion Détails Mettre à jour le contenu mot-clé
Full Auto Shoulder massager Please improve blood flow. Please use it. It's a very healthy app. bugfix Full Auto、 Let's

Screen_Shot_2020-09-08_at_18_52_32.png

3. Configurez Google Cloud Platform pour utiliser "Google Drive API" et "Google Spreadsheet API"

Vous devez cliquer sur "Google Drive API" et "Google SpreadSheet API" pour obtenir le libellé de la feuille de calcul Google.

Et pour accéder à ces API à partir de CI, vous devez créer un compte de service avec GCP.

Accédez à Google Cloud Platform et créez un projet.

Screen_Shot_2020-09-04_at_14_28_51.png

Accédez à API et services> Informations d'identification, cliquez sur Créer des informations d'identification, puis sur Compte de service.

Screen_Shot_2020-09-04_at_14_29_56.png

Remplissez votre nom, votre identifiant et la description de votre compte de service et cliquez sur le bouton Créer.

Screen_Shot_2020-09-04_at_14_32_46.png

Déterminez les autorisations du compte de service. Cette fois, je veux charger la feuille de calcul Google, alors demandez au spectateur (choisissez les autorisations appropriées en temps opportun) et cliquez sur le bouton Continuer.

Screen_Shot_2020-09-04_at_14_33_07.png

Cliquez sur le bouton Terminer.

Screen_Shot_2020-09-04_at_14_37_24.png

Un nouvel élément a été ajouté à la colonne du compte de service. Cliquez sur.

Screen_Shot_2020-09-08_at_19_03_24.png

Cliquez sur Ajouter une clé, puis sur Créer une nouvelle clé.

Screen_Shot_2020-09-08_at_19_03_48.png

Une boîte de dialogue comme celle-ci apparaîtra. Spécifiez JSON et cliquez sur Créer. ** Renommez le fichier JSON enregistré en config.json. ** **

Screen_Shot_2020-09-08_at_19_04_03.png

Ensuite, recherchez «API Google Drive» et «API Google Spreadsheet» dans Services API> Bibliothèque d'API, et activez chaque API pour terminer le paramètre.

Screen Shot 2020-09-08 at 19.12.03.png

4. Créez votre propre action Fastlane

Vous pouvez l'écrire dans le Fastfile, mais afin de ne pas surcharger le Fastfile, créez votre propre Action et divisez le traitement.

Appuyez sur la commande suivante.

bundle exec fastlane new action

On vous demandera un nom, alors devinez un nom approprié. Dois-je dire ** métadonnées **?

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

Un fichier appelé fastlane / action / metadata.rb sera généré.

5. Utilisez "google-drive-Ruby" pour charger la description de l'App Store à partir de la feuille de calcul Google.

Préparation

Utilisez le gem google-drive-ruby pour charger la feuille de calcul Google.

Ajoutez ce qui suit au Gemfile:

gem "google_drive"

Installation.

bundle install

Placez la clé de compte de service (config.json) générée par Google Cloud Platform dans fastlane / action / (Allez ici si vous ne voulez pas mettre la clé de compte de service / items / 0f15157e93b8b9339656 # 7-fastlane-plugin et publié))

Ecrire le code

Ajoutez ce qui suit au début de fastlane / action / metadata.rb.

require "google_drive"

Écrivez le code suivant dans self.run (params). Spécifiez le contenu de la feuille de calcul écrite au début comme les constantes suivantes.

--LANGUAGES spécifie le nom de la feuille --COLUMNS spécifie le nom du fichier texte Fastlane pour chaque élément à partir de la gauche (Reportez-vous à la livraison pour chaque nom de fichier texte)

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

Chargez la feuille de calcul, en spécifiant le chemin du fichier de clé du compte de service et l'ID de la feuille de calcul.

session = GoogleDrive::Session.from_config("config.json")
spreadsheet = session.spreadsheet_by_key("ID de la feuille de calcul")

Tout ce que vous avez à faire est d'extraire le texte de chaque colonne de la dernière ligne de la feuille pour chaque langue et de l'enregistrer dans chaque fichier texte.

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

Code complet

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 de la feuille de calcul")

        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. Exécuter avec Fastfile

Après cela, si vous exécutez des métadonnées sur Fastfile, les éléments lus à partir de la feuille de calcul Google seront enregistrés dans chaque fichier texte.

Exécutez ensuite delivery (skip_metadata: false) pour mettre à jour la description de l'App Store.

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

D'ailleurs, si vous faites une pull request lorsqu'un diff apparaît, c'est recommandé car la différence entre les versions précédentes sera évidente en un coup d'œil.

7. Je l'ai fait un plugin Fastlane et l'ai publié

Ce que j'ai expliqué jusqu'à présent, j'ai essayé Fastlane Plugin.

Il y avait d'autres plug-ins avec le même objectif, mais ** cela me permet de spécifier le fichier de clé du compte de service dans une variable d'environnement car je ne voulais pas le gérer dans Git. ** De plus, si vous spécifiez le nom du fichier texte qui n'est pas utilisé pour la mise à jour des métadonnées dans les colonnes, la colonne y sera ignorée. Je suis.

Vous pouvez l'utiliser comme ça.

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"]
)

Pour plus de détails, veuillez vous référer aux ribodigries suivants.

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

8. Enfin

Jusqu'à présent, je n'étais pas sûr de faire des erreurs à chaque fois que je copiais et collais, mais après la mise à jour automatique, je n'ai fait aucune erreur et c'est devenu beaucoup plus facile.

Si vous rencontrez des problèmes, essayez-le.

Veuillez également lire cet article.

Notez en détail la procédure pour accéder à l'API Qiita dans GAS et remplir automatiquement les résultats dans une feuille de calcul Google

Recommended Posts

Comment mettre à jour automatiquement la description de l'App Store dans Google Spreadsheets et Fastlane
Enregistrer en japonais dans StringProperty dans le magasin de données Google App Engine
Comment mettre à jour Google Sheets à partir de Python
Comment utiliser Google Test en langage C
Comment utiliser is et == en Python
Comment générer une séquence en Python et C ++
Comment afficher des vidéos en ligne dans Google Colab
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Comment exécuter AutoGluon dans un environnement GPU Google Colab
Comment définir Decorator et Decomaker avec une seule fonction
Comment utiliser une bibliothèque qui n'est pas initialement incluse dans Google App Engine
Comment stocker une fonction Python dans la valeur d'un dictionnaire (dict) et appeler la fonction en fonction de la clé
Comment charger des fichiers dans Google Drive avec Google Colaboratory
Comment installer Google Test / Google Mock dans Visual Studio 2019
[Python] Comment trier un dict dans une liste et une instance dans une liste
Comment utiliser Django avec Google App Engine / Python
Comment utiliser Decorator dans Django et comment le créer
Comment utiliser le modèle japonais Spacy avec Google Colaboratory
Comment obtenir des histogrammes RVB et HSV avec OpenCV
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
Les étrangers parlent: Comment nommer les classes et les méthodes en anglais
Comment extraire n'importe quel rendez-vous dans Google Agenda avec Python
[Google Colab] Comment interrompre l'apprentissage, puis le reprendre
Comment utiliser pyenv et pyenv-virtualenv à votre manière
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment obtenir toutes les clés et valeurs du dictionnaire
[Blender] Comment gérer les événements de souris et de clavier dans les scripts Blender
[TF] Comment charger / enregistrer le modèle et le paramètre dans Keras
Comment SSH dans Azure App Service et activer venv
Comment exécuter des commandes et des scripts shell externes en python
Comment créer une trame de données et jouer avec des éléments avec des pandas
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Comment développer en Python
Comment utiliser Google Colaboratory
[sh] Comment stocker les résultats de l'exécution de la commande dans des variables
Comment installer OpenCV sur Cloud9 et l'exécuter en Python
Comment comparer des listes et récupérer des éléments communs dans une liste
Repeated @ app.callback dans Dash Comment écrire correctement l'entrée et l'état
Comment afficher des formules en latex lors de l'utilisation de Sympy (> = 1.4) dans Google Colaboratory
Comment donner et signifier l'option des contraintes dans scipy.optimize.minimize
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
Comment utiliser Google Colaboratory et exemple d'utilisation (PyTorch × DCGAN)
[ROS2] Comment décrire le remappage et les paramètres au lancement au format python
Comment déployer une application Django sur heroku en seulement 5 minutes
Comment afficher les octets de la même manière en Java et Python
[Rails 6] Intégrez Google Map dans l'application et ajoutez un marqueur à l'adresse saisie. [Confirmation des détails]
Comment copier et coller le contenu d'une feuille au format JSON avec une feuille de calcul Google (en utilisant Google Colab)
[Python] Comment faire PCA avec Python
Comment gérer une session dans SQLAlchemy
[Rails] Comment afficher Google Map
Comment installer et utiliser Tesseract-OCR
Comment utiliser les classes dans Theano
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Comment mettre à jour Spyder dans Anaconda
Comment utiliser SQLite en Python