GASでJsonを作成する

はじめに

iOS/AndriodのLocalizeTextをGoogleスプレットシートで管理していたのですが、変更時に差分の確認が行いにくいため、json形式にしてgitで管理することになりました。

GoogleスプレットシートのLogalize文言を全て手作業でJsonに移行した場合すごく時間がかかってしまう為、スクリプトを作成しました。

ログの出力

GASを全く触ったことがなかったので、まず最初にログ出力から行うことにしました。確認方法がわからずちょっとハマりました..

スクリプトの表示

ツール > スクリプトエディタを選択するとスクリプト画面を表示することができます。

ログ出力用コード

毎度おなじみHello World

function myFunction() {
  Logger.log("Hello World");
}

ログの確認

実行しても画面上にはなんの変化もなく、すごくわかりにくかったです。

調べてみると表示 > ログから確認することができるようでした。

これで出力されない場合はスクリプトのページを開きなおすと出ます!、私はそうでした。

Json形式での出力

今回は以下のようなJson形式で保存を行いました。

[
 { "key": "キー",
    "view": ["使用画面"],
    "value":{
        "jp": "メッセージ(日本語)"
    },
    "remarks" : "備考 "
 }
]

だいぶ無理矢理感が強いですが、コードはこんな感じです。

Logに出力された値をそのままコピペすれば良いと思っていたのですが、ログが長すぎて最後のほうのjsonが切れてしまっていました。

function myFunction() {
  var jsonStr = "\n[";
  var count = "3";
  //スプレッドシートの取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //シートの取得
  var sheet = spreadsheet.getActiveSheet();
  
  for (var i = 3; i <= 81; i++){
  
    //画面タイトル取得
    var range = sheet.getRange("D"+i);
    var screenTitle = range.getValue();
    jsonStr += "{ \"key\":\"" + screenTitle + "\",\n"
    
    //画面番号取得
    range = sheet.getRange("E"+i);
    var screenNumber = range.getValue();
    jsonStr += "  \"view\":[\"" + screenNumber + "\"\],\n"
    
    //メッセージ取得
    range = sheet.getRange("F"+i);
    var message = range.getValue();
    jsonStr += "  \"value\":{\n     \"jp\":\"" + message + "\" \n   },\n"
    
    //備考情報取得
    range = sheet.getRange("G"+i);
    var remarks = range.getValue();
    jsonStr += "  \"remarks\":\"" + remarks + "\" \n   },\n"
  }
  Logger.log(jsonStr)
}

データの保存

Json形式で保存したいと思っていたのですがGoogle Apps Scriptの公式ドキュメントをみてもJsonでの保存で不可能っぽかったのでtxtファイル形式で保存を行うことにしました。

保存は以下のようなコードで行うようです。

 var myFolder = DriveApp.getFolderById('URLの後ろについてるID');
  myFolder.createFile('保存するファイル名', '内容', 保存形式);

getFolderByIdに指定するIDは例えば私のマイドライブのURLがhttps://drive.google.com/drive/u/0/folders/1oTK9ymqz7Zpd2Ta8i6j9fyl8aoYj22_x 

だったのですが、1oTK9ymqz7Zpd2Ta8i6j9fyl8aoYj22_xの部分がIDに当たります。

先ほどのコードにファイル出力の部分を加えるとこんな感じです。

function myFunction() {
  var jsonStr = "\n["
  var count = "3"
  //スプレッドシートの取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  //シートの取得
  var sheet = spreadsheet.getActiveSheet()
  
  for (var i = 3; i <= 81; i++){
  
    //画面タイトル取得
    var range = sheet.getRange("D"+i)
    var screenTitle = range.getValue()
    jsonStr += "{ \"key\":\"" + screenTitle + "\",\n"
    
    //画面番号取得
    range = sheet.getRange("E"+i)
    var screenNumber = range.getValue()
    jsonStr += "  \"view\":[\"" + screenNumber + "\"\],\n"
    
    //メッセージ取得
    range = sheet.getRange("F"+i)
    var message = range.getValue()
    jsonStr += "  \"value\":{\n     \"jp\":\"" + message + "\" \n   },\n"
    
    //備考情報取得
    range = sheet.getRange("G"+i)
    var remarks = range.getValue()
    jsonStr += "  \"remarks\":\"" + remarks + "\" \n   },\n"
  }
  jsonStr = jsonStr.slice( 0, -2 )
  jsonStr += "]"
  //フォルダの生成
  var mFolder = DriveApp.getFolderById('1oTK9ymqz7Zpd2Ta8i6j9fyl8aoYj22_x')
  mFolder.createFile("localizeJson",jsonStr, MimeType.PLAIN_TEXT)
}

実際にjsonにフォーマットしたコードはかなり精度が悪くsplitなどがたくさん入って100行を超えるくらいのボリュームになってしまったのでいらなそうな部分は抜いています。

GASではjavascriptの関数が使えるようなので癖で;をつけてしまっている部分がありますが。GASでは;なしでも問題なく動きます。

参考文献

Google Apps Script

【GoogleAppsScript】ログ出力(デバッグ目的)

GAS入門 – DriveAppクラスリファレンス

Enum MimeType

GASで文字コード指定してファイルを書き出す

【JavaScript入門】replaceの文字列置換・正規表現の使い方まとめ!