如何在Google文档中复制行范围?

时间:2012-07-16 08:28:37

标签: google-apps-script google-sheets

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

那么,每次我一个一个地添加一个新行时,我都会设置验证。这令人沮丧。有些人也有同样的问题,在线询问,但没有人回答。

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

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

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

这是我从我看到的例子中得到的全部内容。我是认真的。我一无所获。 如果这复制了一个单元格的范围,那么我想我应该为所有列进行复制。 但是我如何将它们放入新行呢?有像setRange这样的东西吗? 我真的可以使用一些帮助。这让我发疯,我真的没有得到这个剧本的东西。

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

抱歉我的英文。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望编写一个函数,该函数会向工作表添加新行并维护列的现有验证。这当然是可能的,也不是太困难。一种方法可以是“刷新验证”功能,如果您想在其他工作表中重复使用,则可以一次性更新整个工作表。首先,听起来您可以使用您需要了解的有关基本Google Apps脚本的对象类的简要概述:

  • SpreadsheetApp - 将此类视为电子表格服务的基础。它提供的文件I / O和功能本身并不依赖于特定的电子表格,例如UI和数据验证集的创建。它是所有单个电子表格文档的界面。
  • Spreadsheet - 电子表格文档文件,可包含多个表格。这是在云端硬盘中创建新的Google表格文档时创建的内容。提供文档级功能,例如管理所有权,设置权限,访问元数据等的功能。与Sheet类有一些重叠,所以这看起来有点混乱。
  • Sheet - 单个工作表是您通常认为的电子表格:一组行和列。每个电子表格文档都可以包含许多不同的表格。 Sheet类允许您修改工作表的整体外观。您可以冻结或隐藏行,保护单元格范围不被编辑,添加/删除行和列等。您还可以获取有关工作表的数据,例如包含内容的最后一行或整个工作表的最大范围。
  • Range - 从另一个级别开始,我们到达Range对象,它表示一个矩形的单元格区域。这可以与单个单元一样小,也可以与整个单元一样大。然而,Ranges似乎不可能代表不连续的细胞。这是您遇到麻烦的地方,因为您将Range对象视为可以复制并粘贴到工作表中的内容,这是可以理解的。但是Range不是它所代表的单元格中的数据。它只是这些细胞的接口。如果要访问数据本身,则必须下拉到层次结构的底层:
  • 值 - 工作表的实际内容是正常的JavaScript值:字符串,整数,布尔值等,您可以使用Google Apps脚本支持的JavaScript子集进行操作。

为了对工作表中的值执行某些操作,首先从Sheet(从SpreadsheetApp获取)中获取Range对象,然后从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类的工作原理。您可以使用Data Validation Builder创建数据验证对象,该对象允许您将一系列规则链接在一起以应用于范围。然后,将范围设置为该数据验证规则集:

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);

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

答案 1 :(得分: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});