使脚本针对Google电子表格中的特定选项卡运行

时间:2019-12-24 23:04:00

标签: google-apps-script

我的代码需要一些帮助。我是新手。 我有一个很棒的脚本。但我想使其在多个选项卡中起作用,这些选项卡将与“布局1”重复。

我只想在那些“布局x”标签中使用此脚本。我也有其他标签。 我在youtbe视频的帮助下制作了这个脚本。根据我的喜好和需求进行编辑。 但是无法弄清楚如何使其在其他“布局”标签中起作用。

var mainwsname = 'Layout 1';
// tabs i want to edit below. Need help ?
//var mainwsname = ['Layout 1', 'Layout 2', 'Layout 3', 'Layout 4', 'Layout 5', 'Layout 6', 'Layout 7', 'Layout 8', 'Layout 9', 'Layout 10', 'Layout 11', 'Layout 12'];
var optionsname = 'Options';

var firstLevelColumn = 8;
var secondLevelColumn = 1;
var thirdLevelColumn = 2;
var fourthLevelColumn = 3;

var ws= SpreadsheetApp.getActiveSpreadsheet().getSheetByName(mainwsname);
var wsOptions= SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsname);
var options = wsOptions.getRange(2,1,wsOptions.getLastRow()-1,4).getValues(); //4 is getal aantal kolommen in options

function onEdit(e)
{
  var activeCell = e.range;
  var val = activeCell.getValue();

  var r = activeCell.getRow();
  var c = activeCell.getColumn();
  var wsname = activeCell.getSheet().getName()
  if (wsname === mainwsname && c===firstLevelColumn && r>2)
  {

    applyFirstLevelValidation(val ,r);
  } else if(wsname === mainwsname && c===secondLevelColumn && r>2)
  {
    applySecondLevelValidation(val ,r);
  }

} // end onEdit

function applyFirstLevelValidation(val ,r)
{
  if (val === "")
    {
      ws.getRange(r, secondLevelColumn).clearContent();
      ws.getRange(r, secondLevelColumn).clearDataValidations();
       ws.getRange(r, thirdLevelColumn).clearContent();
      ws.getRange(r, thirdLevelColumn).clearDataValidations();
    }
    else{
    ws.getRange(r, secondLevelColumn).clearContent();
     ws.getRange(r, thirdLevelColumn).clearContent();
      ws.getRange(r, secondLevelColumn).clearDataValidations();
       ws.getRange(r, thirdLevelColumn).clearDataValidations();
    var filteredOptions = options.filter(function(o){return o[0]=== val});
    var listToApply= filteredOptions.map(function(o){return o[1]});
    var cell =ws.getRange(r,secondLevelColumn);


  applyValidationToCell(listToApply,cell);
    }
}

function applySecondLevelValidation(val ,r)
{
  if (val === "")
    {
      ws.getRange(r, thirdLevelColumn).clearContent();
      ws.getRange(r, thirdLevelColumn).clearDataValidations();

      ws.getRange(r, fourthLevelColumn).clearContent();
      ws.getRange(r, fourthLevelColumn).clearDataValidations();

    }
    else{
    ws.getRange(r, thirdLevelColumn).clearContent();
    ws.getRange(r, fourthLevelColumn).clearContent();

    var firstLevelColValue= ws.getRange(r, firstLevelColumn).getValue();
    var filteredOptions = options.filter(function(o){return o[0]=== firstLevelColValue && o[1]=== val});
    var thirdColumnValue= filteredOptions.map(function(o){return o[2]});
    var fourthColumnValue= filteredOptions.map(function(o){return o[3]});

     ws.getRange(r,thirdLevelColumn).setValue(thirdColumnValue);
     ws.getRange(r,fourthLevelColumn).setValue(fourthColumnValue);

    }
}
function applyValidationToCell(list,cell)
{

  var rule = SpreadsheetApp.newDataValidation()
  .requireValueInList(list).setAllowInvalid(false)
  .build();

  cell.setDataValidation(rule);
}

3 个答案:

答案 0 :(得分:1)

  • 您只想对onEdit()的工作表名称运行'Layout x,例如Layout 1Layout 2

如果我的理解是正确的,那么该修改如何?请认为这只是几个可能的答案之一。

发件人:

function onEdit(e)
{
  var activeCell = e.range;

收件人:

function onEdit(e)
{
  var activeCell = e.range;
  if (!/Layout \d+/.test(activeCell.getSheet().getSheetName())) return;  // Added

注意:

  • 如果在Layoutx之间没有空格,请将Layout \d+修改为Layout ?\d+

参考:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

答案 1 :(得分:0)

感谢您的帮助,但是我无法使其工作。

我写了一些野蛮的脚本使它现在可以工作。

我写道:

if (sheet.getName() == "Layout 1"){
var mainwsname = 'Layout 1';}

if (sheet.getName() == "Layout 2"){
var mainwsname = 'Layout 2';}

if (sheet.getName() == "Layout 10"){
var mainwsname = 'Layout 10';}

似乎它使我的工作表中的响应时间变慢,但它可以工作。

答案 2 :(得分:0)

  

现在,使用else函数(如果函数+仅声明一次var mainwsname)使它稍微好一点。

     

(将来发布给需要类似事物的人)

var sheet = SpreadsheetApp.getActiveSheet();
  var mainwsname = ' ';

  if (sheet.getName() == "Layout 1"){
  mainwsname = 'Layout 1';}
  else if (sheet.getName() == "Layout 2"){
  mainwsname = 'Layout 2';}
  else if (sheet.getName() == "Layout 3"){
  mainwsname = 'Layout 3';}
  else if (sheet.getName() == "Layout 4"){
  mainwsname = 'Layout 4';}
  else if (sheet.getName() == "Layout 5"){
  mainwsname = 'Layout 5';}
  else if (sheet.getName() == "Layout 6"){
  mainwsname = 'Layout 6';}
  else if (sheet.getName() == "Layout 7"){
  mainwsname = 'Layout 7';}
  else if (sheet.getName() == "Layout 8"){
  mainwsname = 'Layout 8';}
  else if (sheet.getName() == "Layout 9"){
  mainwsname = 'Layout 9';}
  else if (sheet.getName() == "Layout 10"){
  mainwsname = 'Layout 10';}