0

我有一个电子表格,比如 Google Docs 上的 excel。我同时使用 Mozilla Firefox 和 Google Chrome,无论哪个有效。几乎我所有的列都有下拉列表验证(你知道,每个单元格都有一个下拉列表可供选择,我希望我说清楚了)。我在第一次创建电子表格时对它们进行了排列,对我创建的范围内的所有列进行了验证。我的问题是,每当我添加新行时,该行都没有任何验证,所有验证都消失了。旧行仍然有验证。

因此,每次添加新行时,我都会设置验证。这令人沮丧。有的人也有同样的问题,在网上问了,没有人回答。

当我复制带有验证的空行并将其粘贴到新行时,它工作正常。所以,我的意思是,你能帮我写一个脚本吗?就像我执行脚本时复制 5 行一样?

我正在尝试研究脚本,但到目前为止我什么也没做。我认为

var actSc = SpreadsheetApp.getActiveSpreadsheet();
var range = actSc.getRange("A1:B1");

这就是我从我看到的例子中得到的。我是认真的。我什么都没有。如果这复制了一个单元格的范围,那么我想我应该为我的所有列都这样做。但是如何将它们放在新行中?有没有类似 setRange 的东西?我真的可以使用一些帮助。这让我发疯,我真的不明白这个脚本的东西。

我所说的范围是指我有像“STATES”这样的范围,它包括“NY、LA、CA”等。这个 NY、LA、CA 填充了该 STATES 列的单元格中的下拉列表。我希望这个 getRange 意味着这个范围。

对不起我的英语。

4

2 回答 2

3

如果我理解正确,您想要编写一个函数,该函数将向工作表添加新行并维护列的现有验证。这当然是可能的,也不是太难。一种方法可能是“刷新验证”功能,如果您想在其他工作表中重用它,它可以一次更新整个工作表。不过,首先,听起来您可以简要概述一下您需要了解的对象类来执行基本的 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);

因此,您可以非常轻松地将这些概念组合在一起,以编写添加行、构建验证规则集以及向新的单元格范围添加验证所需的任何类型的函数。您可以比我在这里更简洁地完成大多数这些事情,但听起来您正在寻找更深入的解释。我希望它有所帮助。

于 2015-02-14T04:41:41.703 回答
0
   var sheetToUpdate = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();  
    sheetToUpdate.insertRowAfter(sheetToUpdate.getLastRow());

   var rangeToUpdate = sheetToUpdate.getRange(sheetToUpdate.getLastRow()+1,1,1,sheetToUpdate.getMaxColumns());
   sheetToUpdate.getRange(sheetToUpdate.getLastRow(),1,1,sheetToUpdate.getMaxColumns()).copyTo(rangeToUpdate, {formatOnly:true});
于 2012-07-20T12:14:31.037 回答