Google表格脚本-连续引用特定的单元格

时间:2020-01-30 15:04:00

标签: google-apps-script google-sheets

我有一个工作表,当我将特定单元格更改为“是”时,我需要将模板工作表复制到新版本并根据当前行中单元格的值进行命名。

我在弄清楚如何获取所选行中第一个单元格的值时遇到了麻烦。这就是我到目前为止(我知道这是错误的):

function onEdit() { 


  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var currentCell = sheet.getCurrentCell();  

  if (currentCell = "YES") 
  {
    SpreadsheetApp.getActiveSpreadsheet().toast("New change control sheet added to workbook.","Change Control",15);

  var sourceRow = ss.getActiveRange().getRowIndex();
  var tabName = ss.getRange(cell,1).getValues();

    ss.getSheetByName("CCTemplate").showSheet()
    .activate();
    ss.setActiveSheet(ss.getSheetByName('CCTemplate'), true);
    ss.duplicateActiveSheet();
    ss.setActiveSheet(ss.getSheetByName('CCTemplate'), true);
    ss.getActiveSheet().hideSheet();
    ss.setActiveSheet(ss.getSheetByName('Copy of CCTemplate'), true);
    ss.getActiveSheet().setName("CC" & tabName);
  }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

使用event objects

onEdit提供事件对象rangevalue等,它们有助于检索已编辑的范围及其值。

  • 当您想要一个单元格并将其与一个值进行比较时,例如在if (currentCell = "YES")中,您需要检索其值(currentCell.getValue()或仅event.value),并且需要使用==而非=进行比较。
  • 请注意getValues()getValue()。前者为您提供2D数组,如果要检索单个单元格的值,则不需要。
  • 无需更改工作表即可更改其名称。

您可以按以下方式重写代码:

function onEdit(event) { 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var currentCell = event.range;  
  var value = event.value;
  if (value == "YES") 
  {
    ...
    var sourceRow = range.getRowIndex();
    var tabName = ss.getRange(sourceRow, 1).getValue();
    ...
    ss.getSheetByName('Copy of CCTemplate').setName("CC" + tabName);
  }
}

答案 1 :(得分:0)

function onEdit(e) { 
  var sh=e.range.getSheet();
  if(sh.getName()=='Your Sheet Name' && e.value=="YES") {
    e.source.toast="New change control sheet added to workbook.","Change Control",15);
    var tabName=sh.getRange(e.range.rowStart,1).getValue();
    var tsh=e.source.getSheetByName('CCTemplate');
    var csh=tsh.copyTo(e.source);
    csh.setName('CC'+tabName);
  }
}

您应该避免在脚本中使用激活,尤其是在必须在30秒内完成操作的简单触发器中。我认为这段代码的作用与您打算的代码相同。一个重要的区别是,我使用了触发器附带的事件对象中提供的信息。您应该添加代码Logger.log(JSON.stringify(e)),然后查看日志,您会发现有很多可用的信息,这消除了运行诸如电子表格之类的额外功能的需要。