2

GOOGLE SCRIPT通常のJavaScriptだけでなく、氏名に実名の接頭辞が付いていてもなくてもかまいません。

オンラインビデオゲームのランキングを表示するためにGoogleのシートをまとめようとしています(Cube 2, Sauerbraten)。私はすでに、任意の瞬間にサーバー上のプレーヤーのリストを取得する方法を持っています。しかし、人々は常に一族に加盟して離脱するので、新しい一族を離脱するときには、最初からやり直さなければならないと非常に残念です。だから私はすぐにプレーヤーの名前をスキャンするために、以下のコードを思いついた。名前の頭にクランタグがあれば、それを取り除く。 clansPreは、いくつかのclanタグの配列です。考えられるのは、va | P1、RED | P2、.rC | P3、!s] P4、[RUSS] P5、Crowd> P6、oo | P7、P08が一緒にゲームをした場合、それらの統計はP1 P2、P3、P4、P5、P6、P7、およびP08を含む。しかし、私ができた限られたテストでは、名前に関係なく常に最初の3文字が削除されることが示されています。また、cNameはstartWith()を使用しようとしていたときに文字列形式で名前を取得しようとしました。

var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"]; 
var numClans = clansPre.length; 
function nameWoClan(name){ 
    var cName = name.substring(0, name.length) 
    for(var cC = 0; cC<numClans; cC++) { 
    if(cName.search(clansPre[cC]) == 0) { 
     return cName.substring(clansPre[cC].length, name.length) 
    } 
    } 
    return cName; 
} 

それは私は完全に愚かだということかもしれませんが、防衛のために、私は自分自身を教えていなかったことを学んだだけのプログラミング言語は、昨年のJava、だった、と私は本当にに必要とされていませんそれ以来Javaを使用しているので、少し錆びます。とにかくありがとうございました!

答えて

3

あなたはあなたの試行で正しい軌道に乗っていました。

しかし、あなたのコードが与えられました。

var cName = name.substring(0, name.length)と思われます。

あなたのあなたは今、私は一族の名前があるかどうかを判断し、より複雑な例を書かれている

var cName = name;

と同じになりname.length0の開始インデックスからnameのサブスクリプションをしたいと言って名前の一部。そうであれば、一族名を削除しますが、一族名のオブジェクトも返します。現在、このメソッドは大文字と小文字を区別しません(テキストを下げるので)。だから、あなたが敏感なマッチングを小文字たい場合は、2つのコールtoLowerCase()

function nameWoClan(name) { 
    if (!name) 
    return null; 
    var clanName = ''; 
    for (var i = 0; i < clansPre.length; i++) { 
    if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) { 
     clanName = name.substring(0, clansPre[i].length); 
     name = name.substring(clansPre[i].length); 
     break; 
    } 
    } 
    return { 
    clanName: clanName, 
    playerName: name 
    } 
} 

を削除し、私は以下の簡単な例を行っています。 REVIEW

AFTER

$('#extract-name').on('click', function() { 
 
    var names = $('#player-names').val().split('\n'); 
 
    $('#names-list-body').html(''); //clear the table 
 
    names.forEach(function(item, index) { 
 
    var name = nameWoClan(item); 
 
    if (name) { 
 
     $('#names-list-body').append($('<tr><td>' + item + '</td><td>' + name.clanName + '</td><td>' + name.playerName + '</td></tr>')); 
 
    } 
 
    }); 
 

 
}); 
 

 
var clansPre = ["va|", "RED|", ".rC|", "!s]", "vaQ'", "[RUSS]", "cm|", "Crowd>", "oo|"]; 
 

 
function nameWoClan(name) { 
 
    if (!name) 
 
    return null; 
 
    var clanName = ''; 
 
    for (var i = 0; i < clansPre.length; i++) { 
 
    if (name.toLowerCase().startsWith(clansPre[i].toLowerCase())) { 
 
     clanName = name.substring(0, clansPre[i].length); 
 
     name = name.substring(clansPre[i].length); 
 
     break; 
 
    } 
 
    } 
 
    return { 
 
    clanName: clanName, 
 
    playerName: name 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p> 
 
    One full name per line 
 
</p> 
 
<textarea id="player-names" rows="5" cols="65"> 
 
john 
 
.rC|sally 
 
[RUSS]Superman 
 
oo|Batman 
 
RED|MAN 
 
RED|va| 
 
</textarea> 
 
<br/> 
 
<button type="button" id="extract-name"> 
 
    Extract Name 
 
</button> 
 

 
<table id="names-list"> 
 
    <thead> 
 
    <tr> 
 
     <th>Original Name</th> 
 
     <th>Clan Name</th> 
 
     <th>Player Name</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody id="names-list-body"></tbody> 
 
</table>

JSFiddle

EDIT Googleスプレッドシートのスクリプトを確認した後(前にそれを見たことがありません)。私たちは少し余分なビットが必要であることがわかった。 startsWithの最初はサポートされていないようです。理由は分かりません。だから私は関数を使って簡単な始まりを書いた。

function myStartsWith(name, clanName){ 
    name = name.toLowerCase(); 
    clanName = clanName.toLowerCase(); 
    var cNameLen = clanName.length; 
    var nameLen = name.length; 
    return cNameLen < nameLen && name.substring(0, cNameLen) === clanName; 
} 

サンプルコピーCopy of Pasta Ranksを作成し、スクリプトを更新しました。

function myStartsWith(name, clanName){ 
    name = name.toLowerCase(); 
    clanName = clanName.toLowerCase(); 
    var cNameLen = clanName.length; 
    var nameLen = name.length; 
    return cNameLen < nameLen && name.substring(0, cNameLen) === clanName; 
} 

function nameWoClan(name) { 
    if (!name) 
    return null; 
    var clanName = ''; 
    for (var i = 0; i < clansPre.length; i++) { 
    var match = myStartsWith(name, clansPre[i]); 

    if (match) { 
     clanName = name.substring(0, clansPre[i].length); 
     name = name.substring(clansPre[i].length); 
     break; 
    } 
    } 
    return { 
    clanName: clanName, 
    playerName: name 
    } 
} 
function testing(){ 

    //get the sheet to query 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[2]; 

    //get the last row index 
    var lastRow = sheet.getLastRow(); 

    //get the player names range O2:O18 //removes header 
    var range = sheet.getRange(2, 15, lastRow); 

    //get the values for the range 
    var data = range.getValues() 
    var names = []; 

    //iterate the range getting the records. note index [0] as values is a multi-dimension name 
    for(var i = 0;i< lastRow;i++){ 
    var name = nameWoClan(data[i][0]); 
    if(name) 
    { 
     names.push(name); 
    } 
    } 
    var n = names; 
} 

ないprettiesそのしかし、あなたはtesting機能をデバッグし、最終var n = namesにブレークポイントを設定した場合、あなたはnamesは、プレイヤー名や一族の名前のリストが含まれて表示されます。

また、Player名に実際に氏名がなかったので、私はevil.をテストケースとして追加しました。

+0

の間には何もマッチします

/[.*]/g

ありがとうございましたように、あなたが特定の一族のタグパターンに一致する正規表現を作成することができます!私はこれが大いに役立つと思う! [これは私が使用しているものです](https://docs.google.com/spreadsheets/d/1ycJ12z3aU7dFOQdnbb6Qtk3qHEUmLe2hifn7PNkdX9c/edit?usp=sharing) "CurGame"と呼ばれるシートに切り替えます –

+0

これは通常のjavascriptで動作します。しかし、私はそれをGoogleのスクリプトに入れて、それはありません。それは "TypeError:オブジェクトvm16の中で関数startsWithを見つけることができません"となります。それゆえ、私はジレンマに陥っています。サポートページではここで質問していますが、あなたの答えは、私が明示的に求めていることに対して美しく働いています。私はこれをやって悪いと感じますが、私が答えを得たいなら、私はあなたの答えを受け入れられた答えとしてマークする必要があります。申し訳ありません、私は本当にこれをやって悪いと感じています。 –

+0

わかりました。Googleスクリプトと更新プログラムを解説します。 – Nico

0

function removeClanTag(name) { 
 
var index = name.search(/>|\]|\||'/g); 
 
return name.substring(index+1); 
 
} 
 

 
var u = [ 
 
"tag>username", 
 
"tag|username", 
 
"tag'username", 
 
"tag]username", 
 
]; 
 

 
for (var i in u) { 
 
    console.log(removeClanTag(u[i])); 
 
}

あなたはすべてのタグ語尾の場所をスキャンし、その時点の後に1からテキストを削除してみてください。

あなたがより複雑な何かをしたい場合は、中括弧

関連する問題