我有一个电子表格,就像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意味着这个范围。
抱歉我的英文。
答案 0 :(得分:2)
如果我理解正确,您希望编写一个函数,该函数会向工作表添加新行并维护列的现有验证。这当然是可能的,也不是太困难。一种方法可以是“刷新验证”功能,如果您想在其他工作表中重复使用,则可以一次性更新整个工作表。首先,听起来您可以使用您需要了解的有关基本Google Apps脚本的对象类的简要概述:
为了对工作表中的值执行某些操作,首先从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});