我的电子表格中有9个标签,并且只想将排序脚本应用于其中的6个标签。我无法弄清楚如何实现这一目标。
///////Auto Sort Phase Sheets
//get sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ['Phase 1','Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6'];
//get active cell
var editedCell = sheet.getActiveCell();
//get range
var range = sheet.getRange("A2:Z");
//sort by: status, priority, estimated time
range.sort([{column: 2, ascending: true}, {column: 1, ascending: true}, {column:3}]);
我收到此错误:TypeError:在对象阶段1,阶段2,阶段3,阶段4,阶段5,阶段6中找不到函数getActiveCell
当我删除'getActiveCell'时,我收到此错误:TypeError:在对象阶段1,阶段2,阶段3,阶段4,阶段5,阶段6中找不到函数getRange。
当我删除'getRange'时,脚本什么都不做。
答案 0 :(得分:3)
我认为主要问题是您需要遍历“表格”中给出的指定的工作表名称列表。阵列。除此之外,您共享的代码应嵌入到函数中以便运行(顺便说一下,我删除了editedCell变量,因为它是多余的):
///////Auto Sort Phase Sheets
function sortSheets(){
//get sheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
//Specify sheets to be sorted
var sheet_name = ['Phase 1','Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6'];
for (s=0; s<sheet_name.length; s++) {
var sheet = ss.getSheetByName(sheet_name[s]);
//get range
var range = sheet.getRange("A2:Z");
//sort by: status, priority, estimated time
range.sort([{column: 2, ascending: true}, {column: 1, ascending: true}, {column:3}]);
}
}
&#13;
这是我测试过的表单: https://docs.google.com/spreadsheets/d/1VyhzrYwOWgGWszrRoUrQU2ECGqwN_lfb99fqw7x9P1k/edit#gid=0
答案 1 :(得分:1)
要扩展GEOWill的答案,您正在使用数组。 GAS(和JavaScript)不会自动循环遍历包含2D的数组,而不会告诉它。 GAS(Javascript)方法被设计为在阵列上作为整体或在阵列中的单个对象上操作;不是都。您的错误来自于在阵列上尝试使用对象方法。
如果您使用方法.getSheets()
,您将拥有所有工作表名称的数组。这是一个对象数组,您可以在循环时对每个元素执行方法。我已经包含了几种替代方法来循环遍历需要操作的每张纸。
首先是如果需要执行代码的工作表是第一个6:
function phaseFunction () {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < 6; i++) {
var sheet = ss.getSheetByName(sheets[i]);
//further variable definition as usual
//we are now working with a singular sheet object (sheets[i])
//code to perform
}
}
这与GEOWill的策略类似,但总是会执行第6步。如果您想要更改使用哪些工作表并且知道它总是具体,这可能很有用第6页。
以下结构通过选择基于名称的表单来操作GEOWill的工作方式。如果使用相同的工作表并且名称不会更改,则此功能非常有用。
function phaseFunction () {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ['Phase 1','Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6'];
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
//further variable definition as usual
//code to perform
}
}
下一个构造循环遍历所有工作表,无论顺序如何,如果名称匹配,则执行代码。
function phaseFunction () {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
if (sheet == "Name 1" || sheet == "Name 2" || ...) {
//further variable definition as usual
//the variables defined will only be defined on the desired sheets
//code to perform
} else {
continue;
//skip over all those that don't meet the condition
}
}
}
如果您总是有9张(或者不满足条件的表格),您可以更改if()
语句以检查要跳过的那些。这样可以缩短条件语句,并允许添加更多要处理的工作表,使这些工作表始终保持独立,不管单独使用。
最后两个结构将涉及标准命名约定。您的问题意味着您对工作表的命名方式存在标准化,如果单独留下的工作表不符合此标准,您可以使用我在下面写的内容。它检查名称以查看它是否与您设置的约定类似,如果是,则执行代码。例如,如果它以&#34; Phase&#34;开头,则执行代码,如果不是(&#34; Data&#34;,&#34; Log&#34;,&#34; Formulas&#34;,等),不要执行代码。
第一个使用基本字符串方法.includes()
:
function phaseFunction () {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
var name = sheet.getName();
if (name.includes("Phase")) { //this returns a boolean
//further variable definition as usual
//the variables defined will only be defined on the desired sheets
//code to perform
} else {
continue;
//skip over all those that don't meet the condition
}
}
}
以下使用正则表达式。
function phaseFunction () {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
var sheet = ss.getSheetByName(sheets[i]);
var sheetName = sheet.getName();
var nameMatch = sheetName.match(/\b\Phase\b/g);
if (nameMatch[0] != null) {
//further variable definition as usual
//the variables defined will only be defined on the desired sheets
//code to perform
} else {
continue;
//skip over all those that don't meet the condition
}
}
}
此特定RegEx查找短语&#34; Phase&#34 ;;区分大小写。然后它检查.match()
返回的数组,如果它不为null,则执行代码。这种匹配和检查过程有数百种方法。可以找到here和here的RegEx(非常有用)的参考和指南。可以找到一个测试人员here。