スプレッドシートで複数の置換を一度に行うGoogle Apps Script

やりたいこと

スプレッドシート上で、1つの文字列に対して複数のルールに基づいた置換を行う
SUBSTITUTEの引数に置換ルールの連想配列を渡してくるくるさせる感じ

シート

単純に3枚つかってやってみる

辞書用(dict)

A B
1 key value
2 EVXS
3 vuPV
4 3SjD 既婚
5 D53v 未婚
6 3fhq 子あり
7 kqYu 子なし

入力用(input)

A B
1 name ->
2 keys ->

出力用(output)

A B
1 name values
2

GAS

function multiSubstitute() {
  var dictSheetName = "dict";
  var inputSheetName = "input";
  var outputSheetName = "output";

  //シート取得
  var dictSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(dictSheetName);
  var inputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(inputSheetName);
  var outputSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(outputSheetName);
  
  //dict(辞書)シートから連想配列を作成
  var dictRange = dictSheet.getRange(2,1,7,2);// 2行目, 1列目(A), 7行目, 2列目(B) =A2:B7
  var dictValues = dictRange.getValues(); 
  var imDict = {};
  for each(var val in dictValues){
    imDict[val[0]] = val[1];
  }
  
  //inputシートの入力を取得
  var inputRange = inputSheet.getRange(1,2,2);// 1行目, 2列目(B), 2行目, 省略(列に変化がない) =B1:B2
  var inputValues = inputRange.getValues();
  var name = String(inputValues[0]);//名前
  var keysString = String(inputValues[1]);//キーが入った文字列 とりあえずStringにキャスト
  if(name == "" || keysString == ""){
    return;
  }
  //cookie用にurlencodeされた文字列をそのまま貼り付けてもいいようにデコード
  var keysString = keysString.match(/^%5B.*/) ? urldecode(keysString) : keysString;
  
  //辞書にあわせてkeysをvaluesに置換
  var valuesString = keys2values(keysString, imDict);
  
  //outputシートに書き出し
  outputSheet.appendRow([name,valuesString]);
  
  //inputシートの入力をクリア
  inputRange.clear();
  
  function urldecode(str){
    var decoded = decodeURI(str);
    //decodeURIだとカンマが置換されなかったので仕方なく置換
    //replaceが最初の要素しか置換しないのでカンマがなくなるまで繰り返す
    var result = decoded;
    do{
      decoded = result;
      result = decoded.replace("%2C", ",");
    }while(decoded !== result);
    return result;
  }

  //辞書の要素数だけ回してしらみつぶしに置換
  function keys2values(str, imDict){
    Object.keys(imDict).forEach(function(key){
      str = str.replace(String(key), String(this[key]));
    }, imDict);
    return str;
  }
}

結果

入力用(input)

A B
1 name -> test1
2 keys -> {"EVXS","D53v","kqYu"}

これで実行して、

出力用(output)

A B
1 name values
2 test1 {"男","未婚","子なし"}

こうなる
入出力を1シートでやる場合は、入力範囲を選択してscript実行⇒となりの列に出力とかにすればよさそう