我正在尝试使用Google Apps脚本在Google表格中创建一个功能。
我在表1的A列中列出了300个值。
我有一个需要逐个应用于每个值(在A列中)的公式。
公式的输出应为"选择"或"拒绝"。
我可以手动执行此操作,但我需要使用Google Apps脚本自动执行此操作。
我在A栏中有数字,我希望逐行找到他们在Cell B2中的平方根。当平方根大于定义值时,原始数字应列在C列中,而没有方形根大于定义值的数字应列在D列中(参见下面的示例)。
答案 0 :(得分:0)
如果需要,您可以使用Google查询并避免编写脚本。
=QUERY(A2:A,"select A where A <=55",0)
这应该从A列返回小于或等于55的值。您将在下一列中复制该值并将其更改为&gt;。有工作示例here。
作为一个单挑,我不认为你根据该截图获得了B栏中的平方根。我认为34的平方根应该是~5.8而不是你的工作表显示的7.48。您也可以使用=SQRT(A2)
答案 1 :(得分:0)
这个过程需要5个步骤;循环,if / else语句,JavaScript算术,比较运算符,最后将数据写回工作表。对于行值,假设您有一个不应在计算中使用的标题行(冻结或其他)。
您可以在这里找到关于JavaScript运算符,算术和通用语言的精彩指南:
http://www.w3schools.com/js/default.asp
第1步:循环播放一般变量定义
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveRange();
var lastRow = sheet.getLastRow();
var checkColumn = sheet.getMaxColumns();
var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
var check = checkRange.getValues();
var red = "#ff0404";
var green = "#3bec3b";
您会注意到.getRange
方法使用编号的行和列来定义起始位置,然后使用索引来定义要包含的行数/列数。 .lastRow
给出一个数值,我们需要为索引值减去1。
我还使用了一种循环技术,包括显示哪些单元格已被处理。这允许您想要的逐行结构,同时还可以精确定位可能发生错误的位置。
for (var i = 0; i < check.length; i++) {
这是循环的基本结构。我们有一个索引i,我们在每次循环之后递增。最常见的指数是&#39; i&#39;但是可以使用其他变量。如果在循环内循环,更改索引的名称也是一种好习惯。
第2步:If / Else Statements
if (check[i] == "✓") {
continue;
} else {
var checkCell = sheet.getRange((i+2), checkColumn, 1, 1);
function sorter() {
var number = sheet.getRange((i+2), 1, 1, 1).getValue();
var sqrtCell = sheet.getRange((i+2), 2, 1, 1);
var moreCell = sheet.getRange((i+2), 3, 1, 1);
var lessCell = sheet.getRange((i+2), 4, 1, 1);
var outputCell = sheet.getRange((i+2), 5, 1, 1);
我们设置了一个条件来检查,if (check[i] == "✓") {
和要采取的行动continue,
。这基本上意味着如果我们已经设置了一个已经处理过行的标记,请跳过它并检查下一行。 check[i]
使用我们设置的索引来遍历所有值以查找&#39;✓&#39;。
之后,如果声明为假,我们会设置替代方案。这是代码的内容进入并处理数字并写入数据的地方。 .getRange
方法都可以准确定义查找位置和写入位置。
第3步:算术
var squareRoot = Math.sqrt(number);
sqrtCell.setValue(squareRoot);
这些JavaScript方法不会在GAS参考中显示,因为它们是JavaScript本身的组成部分。你可以参考w3schools找到更多。此时,我们以编程方式找到了平方根,并将值写回到之前定义的单元格中。
第4步&amp; 5:运营商&amp;写作价值
if (squareRoot >= 10) {
moreCell.setValue(number);
outputCell.setValue("Select");
outputCell.setBackground(green);
} else {
lessCell.setValue(number);
outputCell.setValue("Reject");
outputCell.setBackground(red);
}
这是另一个if / else语句,它使用运算符作为条件。我们这次检查我们的sqrt变量,并使用运算符>=
获得大于或等于。如果我们发现该陈述为真,则将原始数字写入一列,将另一列标记为&#34;选择&#34;并将该标签设为绿色。如果我们发现该陈述是假的,请将原始号码写入另一列,标记&#34;拒绝&#34;,并将标签设为红色。
我们通过告诉它首先使校验单元格变红,然后处理数字,然后重置背景并写下我们的外延标记来完成代码。
}
checkCell.setBackground(red);
sorter();
checkCell.setBackground('white');
checkCell.setValue("✓");
}
}
}
您可以根据自己的喜好制作标记,并可以使用不同的CSS颜色格式轻松标记单元格。您告诉代码执行的顺序至关重要。注意经常测试并确保在何时以及如何告诉他们的情况下发生事情。
您会注意到我们首先定义了sorter()
函数的内容,然后按顺序调用它。这确保它在我们需要时实际运行。
我还建议调查onEdit()
和时间触发器,以便在编辑/增加值时或在设定的时间间隔内自动运行。
完整的代码和参考图片已包含在下面。
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getActiveRange();
var lastRow = sheet.getLastRow();
var checkColumn = sheet.getMaxColumns();
var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1);
var check = checkRange.getValues();
var red = "#ff0404";
var green = "#3bec3b";
for (var i = 0; i < check.length; i++) {
if (check[i] == "✓") {
continue;
} else {
var checkCell = sheet.getRange((i+2), checkColumn, 1, 1);
function sorter() {
var number = sheet.getRange((i+2), 1, 1, 1).getValue();
var sqrtCell = sheet.getRange((i+2), 2, 1, 1);
var moreCell = sheet.getRange((i+2), 3, 1, 1);
var lessCell = sheet.getRange((i+2), 4, 1, 1);
var outputCell = sheet.getRange((i+2), 5, 1, 1);
var squareRoot = Math.sqrt(number);
sqrtCell.setValue(squareRoot);
if (squareRoot >= 10) {
moreCell.setValue(number);
outputCell.setValue("Select");
outputCell.setBackground(green);
} else {
lessCell.setValue(number);
outputCell.setValue("Reject");
outputCell.setBackground(red);
}
}
checkCell.setBackground(red);
sorter();
checkCell.setBackground('white');
checkCell.setValue("✓");
}
}
}