2

GOOGLE SCRIPT не только обычный javascript.Получение реальных имен из имен, которые могут иметь или не иметь префикс метки клана

Я пытаюсь собрать листы Google, чтобы показать рейтинг для онлайн-видеоигры, Cube 2, Sauerbraten. У меня уже есть способ получить список игроков на сервере в любой момент. Однако, так как люди все время присоединяются и покидают кланы, было бы очень неутешительно, если, когда кто-то уйдет и/или присоединится к новому клану, он должен начать в рейтинге. Поэтому я быстро придумал приведенный ниже код в надежде отсканировать имя игрока, и если в начале его имени есть клановый тег, он избавится от него. clansPre - это массив некоторых тэгов кланов. Идея состоит в том, что если 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) кажется излишним.

Вы говорите, вы хотите подписку name из индекса начала 0 к name.length, который был бы таким же, как

var cName = name;

Теперь я написал более сложный пример, который определяет, если родовое имя является часть имени. Если он затем удаляет имя клана, а также возвращает объект с именем клана. Теперь этот метод нечувствителен к регистру (поскольку он снижает текст). Так что если вы хотите, чувствительно к регистру сопоставления затем удалить два вызова 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 
    } 
} 

я сделал простой пример ниже.

$('#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 Script (никогда не видел его раньше). Найдено, нам нужно несколько дополнительных бит. Первый из 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 содержит список имен игроков и названий кланов.

Также стоит отметить, что ни одно из имен Игрока не имело имени клана, поэтому я добавил evil. в качестве тестового примера.

+0

Спасибо ! Я думаю, это поможет! [Вот что я использую для этого] (https://docs.google.com/spreadsheets/d/1ycJ12z3aU7dFOQdnbb6Qtk3qHEUmLe2hifn7PNkdX9c/edit?usp=sharing) переключиться на лист под названием CurGame –

+0

Так он работает в обычном javascript, но когда я помещаю его в скрипт Google, это не так. Он дает «TypeError: не удается найти функцию startWith в объекте vm16». Поэтому я нахожусь в дилемме. На странице поддержки говорится, что вы задаете здесь вопрос, но ваш ответ прекрасно работает для того, что я теперь понимаю, о чём я прямо спросил. Я плохо себя чувствую, но если я хочу получить ответ, мне нужно отменить ответ в качестве принятого ответа. Извините, я очень плохо это делаю. –

+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 после этой точки.

Если вы хотите сделать что-то более сложное можно создать регулярное выражение для поиска конкретных моделей клан тег как

/[.*]/g

который будет соответствовать ничего между скобками

 Смежные вопросы

  • Нет связанных вопросов^_^