【问题标题】:Print each array value repeatedly using GAS使用 GAS 重复打印每个数组值
【发布时间】:2020-09-09 19:05:13
【问题描述】:

整天都在尝试,但无济于事。我需要能够将数组中的每个值重复返回到谷歌工作表,(n-1) 次,n 作为 array.length。此 array.length 预计会不一致,具体取决于用户通过 google 表单输入的内容。

用户应该在谷歌表单的文本字段中输入一些代码名称,用符号“||”分隔每个代码名称。每个代号必须是唯一的,但在其他过程之前仍会进行验证检查以删除重复项。然后在 google sheet 中逐行返回输出。

例如。在数组中输入 5 个代码名称 = ['Marvell','Xtortion','Ambiguous','Exhale','Xtortion']
我的代码如下:-

//by Bjorn | https://stackoverflow.com/questions/881085/count-the-number-of-occurrences-of-a-character-in-a-string-in-javascript
var cname=sheet.getRange(2,1).getValue();
var code=cname.split("||");
var codename=[...new Set(code)]; //get unique values first
var count=cname.split("||").length - 1;  // to get freq to repeat output of same value.
// ['Marvell','Xtortion','Ambiguous','Exhale']
// array.length is 4, output each value being returned to google sheet start from row 3 in col A should be 3 times (n-1)
  
  var lrow=sheet.getLastRow();
  for(var i=1;i<=count;i++){
    for(var j=0;j<=count;j++){
       sheet.getRange(lrow+1,1,i,1).setValue([j]);
           var lrow=sheet.getLastRow();
   }
  }
}

预期输出:
马维尔
马维尔
马维尔
勒索
勒索
勒索
模棱两可
模棱两可
模棱两可
呼气
呼气
呼气

但我的代码生成如下:
马维尔
勒索
模棱两可
呼气
马维尔
马维尔
勒索
勒索
模棱两可
模棱两可
呼气
呼气
马维尔
马维尔
马维尔
勒索
勒索
勒索
模棱两可
模棱两可
模棱两可
呼气
呼气
呼气

请帮助更正我的代码。提前谢谢你。

【问题讨论】:

    标签: javascript google-apps-script


    【解决方案1】:

    您发布的代码是打印索引,而不是您在帖子中列出的内容。

    1. 您没有正确计算计数。在您的代码中,您将计数设置为 4。您应该使用 codename 而不是重新拆分原始字符串。
    2. 您的第一个循环应该遍历唯一值,而不是 count。想想你在帖子中是如何写的,“我需要能够将数组中的每个值重复返回到 google sheet”。价值先出现,然后重复。
    3. 在您的 for 循环中,您可以在从 0 或 1 开始之间切换。坚持使用其中之一,因为它可以帮助您避免对条件感到困惑。 (例如:for(var i=0;i&lt;=3;i++) {} 将循环 4 次,而不是 3 次。)
    4. 您不应该在sheet.getRange(lrow+1,1,i,1) 中使用i,因为它应该定义how many rows you're inserting,它会随着每次循环迭代而错误地增加。 (无论如何,它并没有真正受到伤害,因为您使用的是setValue(),它无论如何都会忽略该高度。)
    5. setValue([j]); 只会打印索引。您需要将正确的值传递给它codename[i]
    6. Best practices建议你尽可能使用批处理,所以我建议你setValues()

    下面是两个做同样事情的函数。第一个是您的代码,但只是固定的。第二个功能是使用批处理操作和变量名称的改进版本,对我来说更容易理解。

    function fixed() {
      var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
      //by Bjorn | https://stackoverflow.com/questions/881085/count-the-number-of-occurrences-of-a-character-in-a-string-in-javascript
      var cname = sheet.getRange(2,1).getValue();
      var code = cname.split("||");
      var codename = [...new Set(code)]; //get unique values first
      var count= codename.length - 1;  // to get freq to repeat output of same value.
      // ['Marvell','Xtortion','Ambiguous','Exhale']
      // array.length is 4, output each value being returned to google sheet start from row 3 in col A should be 3 times (n-1)
      
      var lrow=sheet.getLastRow();
      for(var i=0;i<codename.length;i++){
        for(var j=0;j<count;j++){
          sheet.getRange(lrow+1,1).setValue(codename[i]);
          var lrow=sheet.getLastRow();
        }
      }
    }
    
    function improved() {
      var sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
      var input = sheet.getRange(2,1).getValue();
      var uniqueValues = [...new Set(input.split("||"))]; 
      var frequency = uniqueValues.length - 1;
      
      var output = [];
      for (var i = 0; i < uniqueValues.length; i++) {
        for (var j = 0; j < frequency; j++) {
          output.push([uniqueValues[i]]);
        }
      }
      
      sheet.getRange(sheet.getLastRow()+1, 1, output.length, output[0].length).setValues(output);
    }
    

    【讨论】:

    • 哇!你摇滚,@迭戈!我很惊讶你把它写得多么详细,并给出了我所寻找的精确解决方案。和奖金,你甚至显示了对我的代码的更正。我测试了两者。但我非常喜欢你的,因为我注意到你的代码处理结果的速度比我的快得多,因为我在运行代码时看到了工作表中的输出。阿罕杜里拉...!!先生,您是我的救星! :)
    【解决方案2】:

    看到这个post那里的分析器:

    function fillArray(value, len) {
      var arr = [];
      for (var i = 0; i < len; i++) {
        arr.push(value);
      }
      return arr;
    }
    

    【讨论】:

    • 我试过这段代码。在日志中,我可以看到数组中的所有值都出现了,但是当我运行它时,输出只显示在数组的第一个值上并且只出现一次。不确定我是否使用了错误的命令让它按照我想要的方式返回,或者这个解决方案现在不适合我的情况。但感谢分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2018-08-02
    • 2020-04-23
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多