【问题标题】:Getting real names out of names that may or may not have a clan tag prefix从可能有也可能没有氏族标签前缀的名字中获取真实姓名
【发布时间】:2017-02-07 00:15:24
【问题描述】:

GOOGLE SCRIPT 不仅仅是普通的 javascript。

我正在尝试整理谷歌表格以显示在线视频游戏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 ,所以我有点生疏了。无论如何,谢谢!

【问题讨论】:

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


    【解决方案1】:

    你的尝试走在了正确的轨道上。

    但是给定你的代码。

    var cName = name.substring(0, name.length) 似乎是多余的。

    你说你想要订阅name0的开始索引到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

    审核后编辑

    查看 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. 作为测试用例。

    【讨论】:

    • 谢谢!我认为这将有很大帮助! Here is what I am using it for 切换到名为“CurGame”的工作表
    • 所以它可以在普通的javascript中工作,但是当我把它放到谷歌脚本中时,它就不行了。它给出“TypeError:在对象 vm16 中找不到函数startsWith”。因此,我处于两难境地。支持页面说在这里问一个问题,但你的回答非常适合我现在意识到我明确要求的内容。这样做我感觉很糟糕,但如果我想得到答案,我需要将您的答案取消标记为已接受的答案。对不起,这样做我感觉很糟糕。
    • 了解.. 将审查 google 脚本并更新答案。
    • 它工作。我将不得不做更多的测试,但任何更多的问题都将是次要的,我应该能够自己解决这些问题。谢谢谢谢谢谢!!!!
    • @DylanSchneiderman 很高兴你能成功。并扩展了我对 Google Sheet 代码的了解。
    【解决方案2】:

    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

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

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 1970-01-01
      • 2015-04-30
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2016-09-18
      • 2022-08-04
      相关资源
      最近更新 更多