在 Google Sheets Apps Script 中,如何检查工作表是否存在,以及是否不添加工作表

Sor*_*rPi 3 javascript try-catch google-sheets google-apps-script

我正在创建一个电子表格来根据输入的日期对事件进行排序。我已经成功地让程序添加了一个包含我想要复制的事件内容的新工作表,但我无法添加到脚本中以允许两个选项。我的目标是让它变成这样:

选项 1:工作表已存在。A2:D2 单元格将从模板工作表复制到标题与单元格 A2 中日期相同的工作表。. A2:D2 将从模板表中清除,留下空白画布。

选项 2:工作表不存在。使用模板工作表作为新工作表的模板,所有信息将被复制,A2 中的日期作为新工作表的名称。. A2:D2 将从模板表中清除,留下空白画布。

我尝试使用 try catch 语句,尝试查找工作表,如果这不起作用,则使用新名称创建工作表。我收到错误消息“名称为“____”的工作表已存在。” 尽管我对原因感到困惑,但由于我收到此错误,因此无法继续捕获。

我还尝试了一个具有类似想法的 if else 语句,指出如果 getSheetByName 不起作用,它将创建一个工作表,否则它将设置一个新的活动工作表。这个有同样的错误。

至于我的代码,我会展示它,但我必须警告它有点笨拙(无论出于何种原因,它不会确认 try catch 语句中的变量,除非我重新声明它们)。

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  ss.setActiveSheet(ss.getSheets()[0])
  var range = sheet.getRange("A2");
  var A2 = range.getValue();
  var templateSheet = ss.getActiveSheet();  
  var value = sheet.getRange("A2").getValue();
  var val = Utilities.formatDate(new Date(A2), "GMT+1", "MM/dd/yyyy");
  range.setValue(new Date(A2)).setNumberFormat("MM/dd/yyyy");
  A2 = SpreadsheetApp.getActiveSheet().getRange('A2').getValue();
   try {
        ss.setActiveSheet(ss.getSheetByName(A2));
        var sheet1 = ss.getSheetByName("GUI");
        var sheet2 = ss.getSheetByName(A2);
        sheet1.getRange("A2:D2").copyTo(sheet2.getRange(sheet2.getLastRow()+1,1,1,4), {contentsOnly:true});
        ss.setActiveSheet(ss.getSheets()[0]);
        sheet.getRange("A2:D2").clearContent();
    } catch (e) {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = ss.getSheets()[0];
        var A2 = range.getValue();
        var templateSheet = ss.getActiveSheet();    
        var val = Utilities.formatDate(new Date(A2), "GMT+1", "MM/dd/yyyy");
        ss.insertSheet(val, ss.getSheets().length, {template: templateSheet});
        ss.setActiveSheet(ss.getSheets()[0]);
        sheet.getRange("A2:D2").clearContent();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人有任何想法为什么这不起作用,我很想知道。谢谢!

小智 7

该函数在不存在具有该名称的工作getSheetByNamenull时返回。如果你以这种方式实现代码,我认为它会更容易。

代码将是这样的:

var sheet2 = ss.getSheetByName(A2);
if( ss.getSheetByName(A2) == null)
{
  //if returned null means the sheet doesn't exist, so create it
  var val = Utilities.formatDate(new Date(A2), "GMT+1", "MM/dd/yyyy");
  ss.insertSheet(val, ss.getSheets().length, {template: templateSheet});
  sheet2 = ss.insertSheet(A2);
}
//Rest of the behavior...
Run Code Online (Sandbox Code Playgroud)