Google表格脚本 - 应用于工作表中的特定选项卡

时间:2016-08-26 16:02:11

标签: google-apps-script google-sheets

我的电子表格中有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'时,脚本什么都不做。

2 个答案:

答案 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;
&#13;
&#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,则执行代码。这种匹配和检查过程有数百种方法。可以找到herehere的RegEx(非常有用)的参考和指南。可以找到一个测试人员here