我有一个工作表,当我将一个特定的单元格更改为“是”时,我需要一个模板表被复制到一个新的版本中,并根据当前行上的单元格的值命名。
我在计算如何获得所选行中的第一个单元格的值时遇到了困难。这就是我目前所拥有的(我知道这是错误的):
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);
}
}有什么想法吗?
发布于 2020-01-30 16:13:34
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);
}
}您应该避免在脚本中使用activate,特别是在必须在30秒内完成的简单触发器中。我认为这个代码做的和你想要的代码是一样的。一个重要的区别是,我使用触发器附带的事件对象中的信息。您应该添加代码Logger.log(JSON.stringify(e)),然后查看日志,您将看到有很多可用的信息,这就不需要运行额外的函数来获取电子表格之类的东西了。
发布于 2020-01-30 16:02:06
使用事件对象
除其他外,onEdit提供了事件对象range和value,它们有助于检索已编辑的范围及其值。
也是
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);
}
}https://stackoverflow.com/questions/59988881
复制相似问题