问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Apps Script中的循环结构详解

创作时间:
作者:
@小白创作中心

Apps Script中的循环结构详解

引用
1
来源
1.
https://spreadsheet.dev/loops-apps-script

循环在Apps Script中的应用

想象一下,你有一个数组,其中包含了班级中所有学生的名字:

let names = [
  "Kirstin Gallant",
  "Joe Sarf",
  "Mark Walling",
  "Jane Li",
  "Xu Jiang",
  "Ramesh Krishna",
  "Wei Tu",
  "Sandra Westgate",
  "Gerardo Riviera"
];

由于有九名学生,我们需要使用九条语句来记录所有他们的名字:

Logger.log(names[0]);
Logger.log(names[1]);
Logger.log(names[2]);
Logger.log(names[3]);
Logger.log(names[4]);
Logger.log(names[5]);
Logger.log(names[6]);
Logger.log(names[7]);
Logger.log(names[8]);

学生的数量越多,所需的语句也就越多。想象一下,如果要记录学校中每个学生的名字,可能会有数百个学生。这会变得非常繁琐,因此必须有一种更好的方法来处理这种情况。

Apps Script中的循环介绍

循环是一种可以多次运行一组语句的代码片段。每次运行称为一次迭代。在Apps Script中有两种常见的循环类型:

  • For循环:用于运行一组语句特定次数。通常在已知迭代次数的情况下使用For循环。
  • While循环:用于在满足某个条件时持续运行一组语句。While循环用于不知道迭代次数的情况。

For循环

For循环通常用于在程序中实现某种计数器。在上面的例子中,我们使用了九条语句来打印班级中学生的姓名。

每条语句的唯一变化是数组索引(0, 1, 2 … 8)。而不是使用九条单独的语句,你可以只使用这一条语句:

Logger.log(names[counter]);

这里,counter是一个变量,其值应该从0(第一个学生)开始,并在每次迭代中增加1,直到达到8(最后一个学生)。

这是使用For循环实现的示例:

for (let counter = 0; counter <= 8; counter = counter + 1) {
  Logger.log(names[counter]);
}

让我们分解一下它是如何工作的。一个For循环有四个步骤:

  1. 初始化计数器变量。
  2. 检查指定的条件是否满足。
  3. 如果条件满足,在循环体内运行语句(在大括号内)。
  4. 增加计数器并进入下一次迭代。

这是一个For循环四个步骤的流程图:

For循环的逐步示例

下表展示了以下For循环的工作原理:

for (let counter = 0; counter <= 8; counter = counter + 1) {
  Logger.log(names[counter]);
}
迭代
计数器值
条件是否满足
运行的语句
1
0(计数器初始化为0)
0 <= 8 是TRUE
Logger.log(names[0]);
2
1
1 <= 8 是TRUE
Logger.log(names[1]);
3
2
2 <= 8 是TRUE
Logger.log(names[2]);
4
3
3 <= 8 是TRUE
Logger.log(names[3]);
5
4
4 <= 8 是TRUE
Logger.log(names[4]);
6
5
5 <= 8 是TRUE
Logger.log(names[5]);
7
6
6 <= 8 是TRUE
Logger.log(names[6]);
8
7
7 <= 8 是TRUE
Logger.log(names[7]);
9
8
8 <= 8 是TRUE
Logger.log(names[8]);
10
9
9 <= 8 是FALSE(停止)
-

While循环

想象一下,你正在编写一个程序来猜测一个秘密数字。假设这个秘密数字是55。在每次迭代中,你的程序生成一个0到100之间的数字。如果这个数字等于55,程序结束。否则,它将进入下一次迭代并猜测下一个数字。

在这里很难使用For循环,因为你不知道需要多少次猜测才能正确猜出55。这就是While循环派上用场的地方。

下面的代码展示了如何使用While循环。代码会持续猜测0到100之间的数字,直到正确猜出55。它还使用numGuesses变量来跟踪正确猜出秘密数字所需的猜测次数。

表达式Math.floor(100 * Math.random())生成一个0到100之间的随机数。函数Math.random()生成一个0到1之间的随机数。假设它生成0.16251661。将其乘以100将得到一个0到100之间的数字。数字0.16251661乘以100后变为16.251661。最后,函数Math.floor将数字向下舍入到最接近的整数。所以Math.floor(16.251661)的结果是16.0。

function guess() {
  let numGuesses = 1;
  let guess = Math.floor(100 * Math.random());
  
  while (guess != 55) {
    numGuesses = numGuesses + 1;
    guess = Math.floor(100 * Math.random());
  }
  Logger.log(numGuesses);
}

While循环的结构比For循环更简单。只有两个步骤:

  1. 检查条件是否满足。
  2. 如果满足条件,在While循环体内运行语句。然后重复步骤1。

这是一个While循环步骤的流程图:

While循环的逐步示例

下表展示了以下While循环的工作原理:

let numGuesses = 1;
let guess = Math.floor(100 * Math.random());

while (guess != 55) {
  numGuesses = numGuesses + 1;
  guess = Math.floor(100 * Math.random());
}
迭代
numGuessesguess的值
条件是否满足
运行的语句
1
numGuesses = 1
guess = 16.0
16.0 != 55 是TRUE
numGuesses = numGuesses + 1;
(numGuesses 变为 2)
guess = Math.floor(100 * Math.random());
(假设 guess 变为 23.0)
2
numGuesses = 2
guess = 23.0
23.0 != 55 是TRUE
numGuesses = numGuesses + 1;
(numGuesses 变为 3)
guess = Math.floor(100 * Math.random());
(假设 guess 变为 71.0)
3
numGuesses = 3
guess = 71.0
71.0 != 55 是TRUE
numGuesses = numGuesses + 1;
(numGuesses 变为 4)
guess = Math.floor(100 * Math.random());
(假设 guess 变为 9.0)
4
numGuesses = 4
guess = 9.0
9.0 != 55 是TRUE
numGuesses = numGuesses + 1;
(numGuesses 变为 5)
guess = Math.floor(100 * Math.random());
(假设 guess 变为 55.0)
5
numGuesses = 5
guess = 55.0
55.0 != 55 是FALSE(停止)
-

在上面的例子中,程序用了5次猜测才正确猜出55。如果你再次运行程序,猜测次数可能会不同。提前知道猜测次数是不可能的。我们提前知道的是什么时候停止。我们知道应该在正确猜出秘密数字时停止。这就是For循环和While循环的区别。如果提前知道迭代次数,使用For循环。如果根据某个条件知道何时停止,但不知道需要多少次迭代才能满足这个条件,使用While循环。

Do...While循环

do...while循环是while循环的一个变体,其关键区别在于条件在循环结束时检查而不是在开始时。这意味着代码块将至少执行一次,然后再评估条件。

这是基本结构:

do {
    // 要执行的代码块
} while (condition);

让我们修改我们的数字猜测示例,使用do...while循环:

function guess() {
    let numGuesses = 1;
    let guess;
    
    do {
        guess = Math.floor(100 * Math.random());
        Logger.log("Guessing: " + guess);
    } while (guess != 55);
    
    Logger.log("Found it in " + numGuesses + " guesses!");
}

何时使用Do...While与While

选择do...while还是while循环取决于你是否希望保证循环体至少执行一次:

  • 使用while循环,当需要在第一次执行前检查条件
  • 使用do...while循环,当你希望确保循环体至少运行一次

这是一个实际示例,展示了两者的区别:

// 使用while循环
let count = 10;
while (count < 10) {
    Logger.log(count);  // 从未执行
    count++;
}
// 使用do...while循环
let count = 10;
do {
    Logger.log(count);  // 执行一次
    count++;
} while (count < 10);

Do...While的常见用例

Do...While循环特别适用于以下场景:

  • 处理至少需要一次的用户输入
  • 验证数据时需要至少尝试一次
  • 执行必须至少发生一次的任务

最佳实践

  • 始终包含一种最终退出循环的方法,以避免无限执行
  • 考虑可读性 - 有时带有初始设置的while循环可能更清晰
  • 使用有意义的变量名,使循环的目的显而易见
  • 为复杂的循环条件添加注释

现在你已经了解了三种类型的循环(for、while和do...while),可以根据具体需求选择最适合的一种。让我们继续学习break和continue语句。

Break和continue语句

Break和continue语句可用于跳出循环或跳到下一次迭代。循环中的代码在这些语句之后将不会运行。

Break语句用于跳出循环。Continue语句用于跳到下一次迭代。

下图说明了这些语句如何与While循环一起工作,但它们在For循环中也以相同的方式工作。

这是一个使用break语句的示例。假设我们只想尝试猜测正确数字一定次数。下面的代码使用break语句在错误猜测1000次后跳出循环。

在之前的代码版本中,While循环仅在正确猜测55时结束。在这个新版本中,While循环可以在两种情况下结束。要么猜对了正确的数字,要么用完了猜测次数。因此,我们需要在循环后使用IF语句来记录正确的消息。如果While循环在没有猜出55的情况下结束,这意味着它用完了猜测次数。否则,它猜对了数字。

function guess() {
  let numGuesses = 1;
  let guess = Math.floor(100 * Math.random());
  
  while (guess != 55) {
    if(numGuesses === 1000) {
      break; // 我们只想猜测1000次
    }
    numGuesses = numGuesses + 1;
    guess = Math.floor(100 * Math.random());
  }
  
  if(guess != 55) {
    // 我们用完了猜测次数
    Logger.log("Could not guess the secret number in 1000 guesses"); 
  } else {
    Logger.log(numGuesses);
  }
  
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号