如果我理解正确,您想要编写一个函数,该函数将向工作表添加新行并维护列的现有验证。这当然是可能的,也不是太难。一种方法可能是“刷新验证”功能,如果您想在其他工作表中重用它,它可以一次更新整个工作表。不过,首先,听起来您可以简要概述一下您需要了解的对象类来执行基本的 Google Apps 脚本:
- SpreadsheetApp - 将此类视为电子表格服务的基础。它提供了与特定电子表格本身无关的文件 I/O 和功能,例如 UI 和数据验证集的创建。它是您所有个人电子表格文档的界面。
- 电子表格- 电子表格文档文件,可以包含多个工作表。这是您在云端硬盘中创建新的 Google 表格文档时创建的内容。提供文档级功能,例如管理所有权、设置权限、访问元数据等的能力。与 Sheet 类有一些重叠,所以这个看起来有点混搭。
- 工作表- 单个工作表是您通常认为的电子表格:一组行和列。每个电子表格文档可以包含许多不同的表格。Sheet 类允许您修改工作表的整体外观。您可以冻结或隐藏行,保护单元格范围不被编辑,添加/删除行和列等。您还可以获取有关工作表的数据,例如具有内容的最后一行或整个工作表的最大范围。
- Range - 下拉到另一个级别,我们到达 Range 对象,它代表某个矩形的单元格区域。这可以像单个单元格一样小,也可以像整个工作表一样大。然而,范围似乎不可能代表不连续的单元格。这是您遇到麻烦的地方,因为您将 Range 对象视为可以复制并粘贴到工作表中的内容,这是可以理解的。但是 Range 不是它所代表的单元格中的数据。它只是这些单元格的接口。如果要访问数据本身,则必须下拉到层次结构的底层:
- 值 - 工作表的实际内容是普通的 JavaScript 值:字符串、整数、布尔值等,您可以使用 Google Apps 脚本支持的 JavaScript 子集对其进行操作。
为了对工作表中的值进行处理,首先从工作表中获取 Range 对象(从 SpreadsheetApp 中获取),然后从 Range 中获取值:
var values = SpreadsheetApp.getActiveSheet().getRange("A1:B1").getValues(); // returns [[]]
请注意,getValues() 返回一个多维数组。作为工作表中值的表示,它看起来像这样:
// row 1 [[column A, column B, column C, column D, ...],
// row 2 [column A, column B, column C, column D, ...],
// row 3 [column A, column B, column C, column D, ...],
// row 4 [column A, column B, column C, column D, ...],
// row 5 [column A, column B, column C, column D, ...], ...]
因此,如果范围 A1:B1 是一行两列的范围,您可以使用 A1 表示法或通过指定范围的左上角行和列,以及您想要的行数和列数来检索值取回:
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("A1:B1");
var range = sheet.getRange(1, 1, 1, 2); // row 1, column 1, 1 row, 2 columns
var values = range.getValues(); // returns [[50, 100]]
如果 A1 中的值为 50,而 B1 中的值为 100,则上面的最后一个函数将返回[[50, 100]]
。您也可以直接访问单个单元格值:
var range = sheet.getRange("A1");
var value = range.getValue(); // returns 50
var cell = range.getCell().getValues(); // returns [[50]]
显然,您也可以设置范围的值:
var range = sheet.getRange("A1:B2");
range.setValues([[50, 100]]);
range = sheet.getRange(1, 1); // same as sheet.getCell(1, 1)
range.setValue(50); // the value of A1, or row 1 column 1, is now 50
下一步是弄清楚数据验证类是如何工作的。您可以使用Data Validation Builder创建一个 Data Validation 对象,它允许您将一系列规则链接在一起以应用于一个范围。然后将范围设置为该数据验证规则集:
var stateList = ["AK", "AL", "AR", ...];
var rules = SpreadsheetApp.newDataValidation() // create a new Data Validation Builder object and use method chaining to add rules to it
.requireValueInList(stateList, true) // first param is the list of values to require, second is true if you want to display a drop down menu, false otherwise
.setAllowInvalid(false) // true if other values are allowed, false otherwise
.setHelpText("Enter a state") // help text when user hovers over the cell
.build();
range.setDataValidation(rules); // apply the rules to a range
现在您可以插入行,规则应自动复制到其中:
var lastRow = sheet.getLastRow(); // get the last row that contains any content
sheet.insertRowAfter(lastRow);
或者复制规则并在其他地方使用它们:
var cell = sheet.getRange(1, 1, 1, 1);
var rule = sheet.getDataValidation(); // returns rule
var range = sheet.getRange("A1:B1");
var rules = range.getDataValidations(); // returns [[rules, rules]]
var lastRow = sheet.getLastRow(); // or sheet.getMaxRows()
range.setDataValidations(rules);
因此,您可以非常轻松地将这些概念组合在一起,以编写添加行、构建验证规则集以及向新的单元格范围添加验证所需的任何类型的函数。您可以比我在这里更简洁地完成大多数这些事情,但听起来您正在寻找更深入的解释。我希望它有所帮助。