【问题标题】:Create a new sheet when a cell in column A is updated更新 A 列中的单元格时创建新工作表
【发布时间】:2019-12-30 16:48:23
【问题描述】:

我正在寻求构建脚本的帮助。基本上我需要的是一个脚本,它可以:

a) 当 A 列中的单元格更新时,在工作簿中创建一个新工作表,但不创建重复项;

b) 复制并粘贴与更新的列关联的范围;

c) 根据 A 列中更新的单元格重命名工作表,最后

d) 将新工作表限制为 200 行。

任何帮助将不胜感激。

我知道下面的代码无法运行,我一直在尝试许多不同的变体来测试功能,并想对我一直在努力的方向提出一些想法。

function onEdit(e){
    var range = e.range;
    if(range.getColumn() == 1){
        range.setNote("COLUMN: "+ range.getColumn());
    };
function insertSheet() {
  var spreadsheet = SpreadsheetApp.getActive();
      spreadsheet.insertSheet(58);
  spreadsheet.getActiveSheet().setName(spreadsheet.getRange('A214:A216'));
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('EOD Report Automation MASTER'), true);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('A214:A216'), true);
  spreadsheet.getRange('\'EOD Report Automation MASTER\'!A214:J216').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
}
}

【问题讨论】:

  • 感谢您与我们联系。你能分享一下你到目前为止所做的任何代码或工作吗?这将帮助其他读者了解如何帮助您。否则,将无法为您指明正确的方向。
  • 您的代码没有多大意义.setName(spreadsheet.getRange('A214:A216')); setName() 需要一个字符串,而您给出了一个范围。阅读文档并更新您的脚本。

标签: google-apps-script google-sheets


【解决方案1】:

这是一个使用 onEdit() 创建新工作表的简单示例。当您更清楚地解释您想要什么时,我很乐意对其进行修改以满足您的要求。

function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()=='Sheet5' && e.range.columnStart==1 && e.value) {
    var nA=e.source.getSheets().map(function(sh,i){return sh.getName();});
    if(nA.indexOf(e.value)==-1) {
      var nsh=e.source.insertSheet(e.value);
    }else{
      e.source.toast(Utilities.formatString("Attempt to create a duplicate Sheet: %s", e.value),"Duplicate Check",-1);
    }
    e.range.activate();
  }
}

在 A 列中输入工作表名称。它将使用您输入的名称创建工作表,除非您输入重复的名称。

将数据从当前工作表复制到新工作表的版本:

function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()=='Sheet5' && e.range.columnStart==1 && e.value) {
    var nA=e.source.getSheets().map(function(sh,i){return sh.getName();});
    if(nA.indexOf(e.value)==-1) {
      var tsh=e.source.insertSheet(e.value);
      var svA=sh.getRange(e.range.rowStart,1,3,10).getValues();
      tsh.getRange(tsh.getLastRow()+1,1,svA.length,svA[0].length).setValues(svA);
    }else{
      e.source.toast(Utilities.formatString("Attempt to create a duplicate Sheet: %s", e.value),"Duplicate Check",-1);
    }
    e.range.activate();
  }
}


function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()=='Sheet5' && e.range.columnStart==1 && e.value) {
    var nA=e.source.getSheets().map(function(sh,i){return sh.getName();});
    if(nA.indexOf(e.value)==-1) {
      var tsh=e.source.insertSheet(e.value);
      var srg=sh.getRange(e.range.rowStart,1,3,10);
      var trg=tsh.getRange(tsh.getLastRow()+1,1);
      srg.copyTo(trg);
    }else{
      e.source.toast(Utilities.formatString("Attempt to create a duplicate Sheet: %s", e.value),"Duplicate Check",-1);
    }
    e.range.activate();
  }
}

【讨论】:

  • 这是完美的。非常感谢你。最后,我需要弄清楚如何自动导入相对范围 '\'Sheet5\'!A2:J24',而不是创建一个空白表的脚本
  • 从哪里导入相对范围?我们可以在新工作表的某处放置一个公式,希望它是什么?
  • 来自正在更新的同一张工作表,在本例中为工作表 5。该范围是上面代码中正在更新的列/行的扩展。例如,当前当使用“测试”输入第 5 页上的 A2 时,会创建一个名为“测试”的新工作表。现在我想从同一张表 5 中导入或复制 A2:J4 并将其粘贴到新的“测试”表中,但要让脚本与正在更新的单元格相关,就像上面的代码一样。
  • 是否要将它们复制到新工作表的同一范围内?
  • 它们应该被复制到新工作表的 A1:J3。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多