从可能有也可能没有clan标签前缀的名称中获取真实姓名

时间:2017-02-07 00:15:24

标签: javascript java google-sheets spreadsheet google-spreadsheet-api

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个字符,无论名称如何。此外,当我尝试使用startWith()时,cName是我尝试以字符串形式获取名称。

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,所以我很生疏。无论如何,谢谢!

2 个答案:

答案 0 :(得分: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
  }
}

我在下面做了一个简单的例子。

&#13;
&#13;
$('#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
  }
}
&#13;
<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>
&#13;
&#13;
&#13;

JSFiddle

审核后编辑

查看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;
}

它不是美妙的,但如果您调试testing函数并在最终var n = names上设置断点,您将看到names包含一个播放器名称和部落名称列表。

另外值得注意的是,没有一个播放器名称实际上有一个部落名称所以我添加了evil.作为测试用例。

答案 1 :(得分: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中删除文本。

如果你想做一些更复杂的事情你可以创建一个正则表达式来匹配特定的部落标签模式,如

/ [*] /克

哪个将匹配大括号之间的任何内容