Apps Script中的循环结构详解
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循环有四个步骤:
- 初始化计数器变量。
- 检查指定的条件是否满足。
- 如果条件满足,在循环体内运行语句(在大括号内)。
- 增加计数器并进入下一次迭代。
这是一个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循环更简单。只有两个步骤:
- 检查条件是否满足。
- 如果满足条件,在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());
}
迭代 | numGuesses 和guess 的值 | 条件是否满足 | 运行的语句 |
---|---|---|---|
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);
}
}