// 入力の想定はWIRES-Xのactive node list CSV出力形式
// A : node name
// B : DTMF
// C : CALL
// D : type (Digital or Analog)
// E : City
// F : state
// G : countory
// H : Freq
// I : tone
// J : 緯度 N:00 00 00, N:01 01 01
// K : 経度 E:000 00 00, E:001 01 01
// L : コメント
//public class Constants {
// public static final int ROW_H = 8;
// public static final int ROW_J = 10;
// public static final int ROW_K = 11;
//}
// シートが表示された際に呼び出される関数
function onOpen() {
var ss = SpreadsheetApp.getActive();
var items = [
{name: 'JK列経度緯度変換...', functionName: 'customMenuKEIDOIDO2'},
{name: '周波数表示整形...', functionName: 'customMenuFREQFIX'},
{name: 'YAESUサイトから取り込み...', functionName: 'customMenuREAD'}
];
ss.addMenu('WIRES-X変換メニュー', items);
}
//
// J列とK列を変換して置き換え
// google mapはシングル、ダブルコーテーションがあると読み込みエラーになるので置き換えが必要
//
function customMenuKEIDOIDO() {
var sheet = SpreadsheetApp.getActiveSheet();
// var range = getActiveSelection(sheet);
// 指定されたrangeのループ
// 毎回ロ呼び出すのは遅いらしいけどといあえず
var last_row = sheet.getLastRow();
var last_column = sheet.getLastColumn();
// 選択に関係なくアクティブシート全部をなめる
for (var i = 1; i <= last_row; i++) {
for (var j = 10; j <= 11; j++) { // J,Kは10と11なはず
var data = sheet.getRange(i, j).getValue() ; // 値の所得
// if(data.length != 0){
data = convWIRES_LatLot(data); // 値の変換
// USAなのにE,東経に人とかどうする?まぁ手動で直すか
if (data == ""){
// 緯度経度が空ならその行消してしまうか
sheet.DeleteRow(i);
}else{
sheet.getRange(i,j).setValue(data); // 値の入れ替え
// }
}
}
}
}
//
// 行列処理で高速化バージョン
//
function customMenuKEIDOIDO2() {
var sheet = SpreadsheetApp.getActiveSheet();
var last_row = sheet.getLastRow();
// 最終行まで2列の値を一気に取得
var values = sheet.getRange(1, 10, last_row, 2).getValues();
// 行配列を定義
var rows_J = [];
var rows_K = [];
for (var row = 0; row < last_row; row++) {
// 列配列を定義
var cols = [];
// C列に設定する値を計算(A列の値+B列の値)
var answer = convWIRES_LatLot(values[row][0]);
// 列配列に計算結果を設定
cols.push(answer);
// 行配列に列配列を設定
rows_J.push(cols);
}
for (var row = 0; row < last_row; row++) {
// 列配列を定義
var cols = [];
// C列に設定する値を計算(A列の値+B列の値)
var answer = convWIRES_LatLot(values[row][1]);
// 列配列に計算結果を設定
cols.push(answer);
// 行配列に列配列を設定
// スプレッドシートの書式設定が数値になってしまう?
rows_K.push(cols);
}
// 計算結果をC列に設定
sheet.getRange(1, 10, last_row, 1).setValues(rows_J);
sheet.getRange(1, 11, last_row, 1).setValues(rows_K);
}
//
// H列周波数表示一括返還 8番目のカラム
// 行列処理で高速化バージョン
//
function customMenuFREQFIX() {
var sheet = SpreadsheetApp.getActiveSheet();
var last_row = sheet.getLastRow();
// 最終行まで列の値を一気に取得
// var values = sheet.getRange(1, ROW_H, last_row, 1).getValues();
var values = sheet.getRange(1, 8, last_row, 1).getValues();
// 行配列を定義
var rows = [];
for (var row = 0; row < last_row; row++) {
// 列配列を定義
var cols = [];
// C列に設定する値を計算(A列の値+B列の値)
var answer = fix_FREQ_format(values[row][0]);
// 列配列に計算結果を設定
cols.push(answer);
// 行配列に列配列を設定
rows.push(cols);
}
// 計算結果をC列に設定
// sheet.getRange(1, ROW_H, last_row, 1).setValues(rows);
sheet.getRange(1, 8, last_row, 1).setValues(rows);
}
//
// WIRESのcsv出力の経度緯度表記をgoogle mapで読める形式に変換する
// スプレッドの関数表記だと下記と同じ
// =(value(right(left(L3,4),2))+value(right(left(L3,7),2))/60+value(right(left(L3,11),2))/3600)*if(left(L3,1) = "S",-1,1)
//
// 引数はstringクラスを期待
//
function convWIRES_LatLot(str){
if(str.length <= 11) return ""; // 文字列の長さが短い場合はゼロを返す
switch(str.slice(0,1)){ // 先頭の文字で分岐処理
case 'E': // for E:135 23' 32" type, length 13
var a = str.slice(2,5);
var b = str.slice(6,8);
var c = str.slice(10,12);
var l = 1;
break;
case 'W':
var a = str.slice(2,5);
var b = str.slice(6,8);
var c = str.slice(10,12);
var l = -1; // 西経はマイナス値
break;
case 'N': // for N:34 26' 56" type
var a = str.slice(2,4);
var b = str.slice(5,7);
var c = str.slice(9,11);
var l = 1;
break;
case 'S':
var a = str.slice(2,4);
var b = str.slice(5,7);
var c = str.slice(9,11);
var l = -1; // 南緯はマイナス値
break;
default: // 先頭に指定文字がない場合はゼロにする
var a = "0";
var b = "0";
var c = "0";
var l = 0;
}
if(l == 0){ // ゼロだったら空の文字列を返す
var s = "";
}else{
// 整数に変換して演算
// 先頭が0だと16進数扱いになってしまうので基数を明示的に指定
l = (parseInt(a,10) + parseInt(b,10)/60 + parseInt(c,10)/3600) * l;
var s = Utilities.formatString("%11.6f", l); // 符号付11文字に整形
}
return s;
}
//
// 周波数表記の整形。144.4とか
// 表記を揃えないとgoogle map上の分類が異なってしまう
//
function fix_FREQ_format (str){
if(str.length > 8) return str; // 8文字 "430.1Mhz"とか以上なら触らない
if(str.indexOf("MHz") == -1) return str; // MHzの文字が含まれていないと処理しない
// デフォルトの表記を削る? 144.0MHz
//
// f = parseFloat(RegExExtract(str,"[0-9]+.[0-9]+"));
f = parseFloat(str.slice(0,str.length-3));
if (f == 144) f = 0;
// デフォルトの表記を削る? 144.0MHz
if(f == 0) {
return ""; // 評価値がゼロなら空の文字列を返す
}else{
var s = Utilities.formatString("%6.2fMHz", f); // 符号付11文字に整形、5K単位の指定はとりあえず無し
return s;
}
}