やりたいこと
スプレッドシート上で、1つの文字列に対して複数のルールに基づいた置換を行う
SUBSTITUTEの引数に置換ルールの連想配列を渡してくるくるさせる感じ
シート
単純に3枚つかってやってみる
辞書用(dict)
|
A |
B |
1 |
key |
value |
2 |
EVXS |
男 |
3 |
vuPV |
女 |
4 |
3SjD |
既婚 |
5 |
D53v |
未婚 |
6 |
3fhq |
子あり |
7 |
kqYu |
子なし |
入力用(input)
出力用(output)
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);
var dictRange = dictSheet.getRange(2,1,7,2);
var dictValues = dictRange.getValues();
var imDict = {};
for each(var val in dictValues){
imDict[val[0]] = val[1];
}
var inputRange = inputSheet.getRange(1,2,2);
var inputValues = inputRange.getValues();
var name = String(inputValues[0]);
var keysString = String(inputValues[1]);
if(name == "" || keysString == ""){
return;
}
var keysString = keysString.match(/^%5B.*/) ? urldecode(keysString) : keysString;
var valuesString = keys2values(keysString, imDict);
outputSheet.appendRow([name,valuesString]);
inputRange.clear();
function urldecode(str){
var decoded = decodeURI(str);
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実行⇒となりの列に出力とかにすればよさそう