自动将数字添加到10行 - Google Script

时间:2018-04-10 22:58:23

标签: javascript loops for-loop if-statement google-apps-script

第一篇文章,没有那么多问题更多建议。

我一直致力于在Google Scripts中将一定数量的数字添加到10行中。我有以下代码可以工作,但无法帮助我们思考有一种更简单的方法来实现这一目标。

我已经对代码进行了评论,解释了哪个部分可以执行哪些操作,但实际上它需要来自不同单元格的数字,然后以10个为一组创建连续数字的行。

function orderArea1() {
  for(x = 0, y = 0, z = 1; z <= releaseNoteSH.getRange(10, 4).getValue(); z++){ // Sets variables; checks the z is lower or equal to source quantity, increase z by 1

  y = y + 0.099; // Add 0.099 to y. This is to stop the row reference changing too early

  releaseNoteSH.getRange(Math.floor(y + 10), x + 6).setValue(z); // Set location of first number using y rounded down to the nearest integer, and set value using z

  x++; // Add 1 to x

  if(x >= 10){ // If/when x reaches 10 reset x to 0
    x = 0;
  }
  }
}

如果有人能就如何简化这一点给我一个想法,我会非常有兴趣听到!

我现在只学习了一个星期左右的JavaScript,这个网站非常宝贵,感谢大家在这里!

1 个答案:

答案 0 :(得分:0)

这里有很多值得讨论的内容,但我必须在第一周对开发人员说,这是一个非常聪明的黑客。

看起来你最终想要这样的东西:

releaseNoteSH.getRange(row, col).setValue(z);

z是一个从1开始并达到某个未知限制的数字,row是10或更高的数字,具体取决于有多少行,col是一个6到15之间的数字,取决于我们在行中的位置。从单个数字计算行和列的正确方法如下所示:

var row = Math.floor(z/10); // This number starts at 0 and goes up by 1 every time z goes up by 10
var col = z % 10; // This number starts at 0 and goes up along with z, but starts over every time it hits 10
releaseNoteSH.getRange(row + 10, col + 6).setValue(z + 1); // Because z now starts at 0

对于行,我们除以我们想要行的大小,然后向下舍入。为了每个人的理智,我们将在0开始计算z。

对于列,你会大声读出该行,&#34; col等于z mod one。&#34; %是javascript中的modulo operator(只要您使用正数)。 Modulo是一个基本的算术运算,在编程中非常重要,但由于某些原因,并没有在+-等学校中教授。这意味着,&#34;将左边的数字除以右边,然后返回剩余的数字而不是答案。因此,对于数字0-9,z / 10等于0,余数为z。然后,对于数字10-19,z / 10为1,其余为z,依此类推。

全部放在一起:

var max = releaseNoteSH.getRange(10, 4).getValue();

for (var i = 0; i < max; i++) {
  var row = Math.floor(i/10);
  var col = i % 10;
  releaseNoteSH.getRange(row + 10, col + 6).setValue(i + 1);
}

此版本的另一个改进是存储我们在循环外的变量中计算的数字。目前,您的代码每次循环运行时都会调用releaseNoteSH.getRange(10, 4).getValue();。由于该单元格中的数字将始终相同,因此所有这些函数调用都是浪费时间。

您的下一个改进是弄清楚如何使用app scripts API只调用releaseNoteSH.getRange()一次,而不是每次都在循环内重复它。