【问题标题】:Picking Random Cell, Ignoring empty选择随机单元格,忽略空单元格
【发布时间】:2020-07-04 01:55:57
【问题描述】:

我的编码技能不是最好的,但我知道如何使用 excel/sheets。

我试图让一个单元格在列中选择一个随机单元格,但忽略空的单元格。到目前为止,我可以让它选择一个随机单元格,但是如果单元格为空,我该如何让它继续呢?

更具体地说,我有一个想法,要在一个基于万智牌收集游戏模式的活动中玩游戏:部落,并使用 Google 表格作为“敌人”套牌。以下链接只是示例。不是实际的想法。

https://docs.google.com/spreadsheets/d/1XKMCguvpI_4PDtBYVXa4_FaH7O3WgckRWYbQ75_5F7E/edit?usp=sharing

【问题讨论】:

    标签: google-apps-script random google-sheets filter google-sheets-formula


    【解决方案1】:

    答案:

    您可以将列定义为范围,仅将非空单元格推送到数组并选择随机元素。

    代码:

    假设您要选择的列是名为Sheet1 的工作表中的列A,并且从A 开始:

    function selectRandomCell() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var range = ss.getSheetByName("Sheet1").getRange("A1:A").getValues();
      var values = [];
      
      for (var i = 0; i < range.length; i++) {
        if (range[i][0] == "") {
          continue;
        }
        else {
          values.push(range[i][0]);
        }
      }
    
      return values[Math.floor(Math.random() * values.length)]);
    }
    

    不过,您可以根据需要更改范围。

    【讨论】:

    • 就像第一个建议一样,我不确定它的作用,甚至不知道该放在哪里。这些表格似乎比明显的编码更多。
    【解决方案2】:

    你可以使用:

    =INDEX(SORT(FILTER({RANDARRAY(G3:G), G3:G}, L3:L=TRUE)), 1, 2)
    

    获取随机 ID 1 或 ID 9

    =TRUE可以改成&lt;&gt;""模拟空单元格


    小狗名字:

    =VLOOKUP(INDEX(SORT(FILTER({RANDARRAY(G3:G), G3:G}, L3:L=TRUE)), 1, 2), G:H, 2, 0)
    

    或者只是:

    =INDEX(SORT(FILTER({RANDARRAY(G3:G), H3:H}, L3:L=TRUE)), 1, 2)
    

    【讨论】:

    • 似乎第一个效果非常好。它忽略了我正在寻找的标准,只选择与选择相关的数据。我猜这是随机从范围中挑选的 RANDARRAY。非常感谢 Player0 :D .. 不知道最后两个是做什么用的。似乎他们随机检查 A17:D19 中的名称。
    • 问题:它如何检查“活动”和“丢弃”区域?我没有看到对这些单元格的任何引用。
    • 排除您需要的活动和丢弃区域:i.stack.imgur.com/ZHSN2.png
    • 哦不,我不想排除他们。我只是想知道它如何在没有任何地方提到的单元格的情况下检查它们。特别是因为我发布的表格是一个演示,并且我计划扩大丢弃和活动卡的区域。
    • 那我想我误解了“从甲板上拿出来”的意思
    【解决方案3】:
    function pickANonEmptyRandomCellFromARange() {
      const ss=SpreadsheetApp.getActive();
      const sh=ss.getActiveSheet();
      const rg=sh.getDataRange();
      const vs=rg.getDisplayValues();
      let v=[];
      //This loops through all of the rows r stands for the row element  is the index
      vs.forEach(function(r,i){
        //this loops through each column and c stands for the cell element  j is the index
        r.forEach(function(c,j) {
          //this asks if the cell is not blank thee push the A1Notation into an array
          if(c){v.push(sh.getRange(i+1, j+1).getA1Notation());}
        });
      });
      //This is a dialog which displays v[random index] which is the A1 Notation of the selected element. 
      SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(v[Math.floor(Math.random()*v.length)]), 'Random Non Empty Cell');
    }
    

    【讨论】:

    • 这看起来不像普通的工作表编码,所以看不出它在做什么。
    • 我在里面放了一些cmets来帮助你。抱歉,我认为这是非常直截了当的。你可能想多花一点时间学习 ES6,因为更高版本的 Javascript 可能会变得相当神秘,因为许多命令可以串成一行。而且我通常不使用任何 cmets。
    猜你喜欢
    • 2022-11-17
    • 2019-12-14
    • 2012-08-30
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2022-10-08
    相关资源
    最近更新 更多