みらい研究室実行委員会の6月のイベントのアンケート解析で、住んでいる区市町村名を問う項目の集計を備え付けのifやらleftやらmid関数でやりくりするのは限界があったので、
Google Apps Script(通称GAS、ExcelVBAみたいな位置で言語的にはJavaScript)で関数を作りました。
ただ、データ数が2000件近くあるので全セルにこの作った関数を呼ぶ式を打つと
エラー: Script invoked too many times per second for this Google user accout.
といった具合に怒られるので対策が必要でした。
Google スプレッドシートでカスタム関数を多くのセルで呼び出しエラーが表示される場合、配列を返す関数(配列数式)に変更する。または、新しいスプレッドシートを利用。 | すぐに忘れる脳みそのためのメモ
を参考に配列を返す関数を作ります。
最も注意するべきなのは、自作関数の引数にある適当な範囲を渡した時の引数は、「stringのArrayのArray」ということです。断じて「stringのarray」ではありません。
function remove_prefectures_name(str){
if(typeof str !== "string") return "error: unexpected input.";
var buf = "";
var tmp = str.charCodeAt(2);
if("道".charCodeAt(0) === tmp || "都".charCodeAt(0) === tmp || "府".charCodeAt(0) === tmp || "県".charCodeAt(0) === tmp){
buf = str.slice(3);
}
else if("県".charCodeAt(0) === str.charCodeAt(3)){
buf = str.slice(4);
}
return (buf.length === 0) ? str : buf;
}
function match_in_array(arr, str){
var is_matched = false;
for(var i = 0; !is_matched && i < arr.length; ++i){
is_matched = (arr[i] === str);
}
return is_matched;
}
function add_City(str){
var case_do_not_add_City = ["市", "区", "町", "村", "県", "都", "道", "府", "県"];
return (match_in_array(case_do_not_add_City, str.slice(-1))) ? str : str + "市";
}
function normalize_adress_helper(main_input, case1_input, case4_input){
if(typeof main_input !== "string" || typeof case1_input !== "string" || typeof case4_input !== "string"){
throw new TypeError("main_input(type:" + typeof main_input + ")unexpected input.");
}
var re = "";
switch(main_input){
case "1.東京23区内":
re = (case1_input === "無記入" || case1_input === "") ? "無記入" : "1-" + case1_input + "区";
break;
case "4.その他":
var do_not_edit = ["アメリカ", "韓国", "korea"];
re = (case4_input === "無記入" || case4_input === "") ? "無記入" : (match_in_array(do_not_edit, case4_input)) ? case4_input : add_City(remove_prefectures_name(case4_input));
break;
default:
re = main_input;
}
return re;
}
function normalize_adress(main_input, case1_input, case4_input){
if(typeof main_input === "string" && typeof case1_input === "string" && typeof case4_input === "string"){
return normalize_adress_helper(main_input, case1_input, case4_input);
}
else if(Array.isArray(main_input) && Array.isArray(case1_input) && Array.isArray(case4_input) && main_input.length == case1_input.length && case1_input.length == case4_input.length){
var re = [];
for(var i = 0; i < main_input.length; ++i){
re.push(normalize_adress_helper(main_input[i][0], case1_input[i][0], case4_input[i][0]));
}
return re;
}
else{
throw new TypeError("main_input(type:" + typeof main_input + ")unexpected input.");
}
}