检查工作表名称是否存在,工作表名称中是否为真增量号

时间:2018-10-24 11:48:46

标签: javascript google-apps-script google-sheets

我有以下代码部分:

  var date = new Date().toLocaleDateString();
  var existingSheet = SpreadsheetApp.getActive().getSheetByName(date);
  if (existingSheet) {
    SpreadsheetApp.getActiveSpreadsheet().renameActiveSheet(date + "[OLD]");
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(date);
  } else {
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(date);
  }

但是,我知道当/如果在同一个名称的工作表已存在的同一日期第三次调用它时,这将失败(我不想删除使用日期[OLD] 名称格式)。

在工作表名称上添加递增数字的最佳方法是什么?
脚本运行时,它将检查工作表是否存在,是否将工作表重命名为 date [OLD] -下次运行时,它将最后创建的工作表重命名为 date [OLD 2] ,依此类推。

2 个答案:

答案 0 :(得分:0)

您可以考虑在每次调用之后添加flush(),以便在添加新工作表之前将待处理的更新应用于工作表。

SpreadsheetApp.flush();

答案 1 :(得分:0)

我编写了一个类似但更通用的函数,将“_1”附加到现有工作表的名称并根据需要增加数字。

请注意,在主代码中,我还说明了如何使用 insertSheet 插入带有原始工作表中数据副本的新工作表,以及如何将副本作为最后一张工作表插入,而不是作为第一张工作表插入工作表,在电子表格文档中。

见:https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#insertSheet(String,Integer,Object)

  var sourceSS = SpreadsheetApp.getActiveSpreadsheet();
  origSheetName = "March 2021";
  var origSheet = sourceSS.getSheetByName(origSheetName);

  //returns original, or _1, _2 ... when a sheet by a prior name exists
  var name = getFirstUnusedName(sourceSS, origSheetName);

  //Note: using the option {template: origSheet} copies the data to the new sheet
  //Note 2: adding the index of 199 places the sheet with the appended _number
  //as the last instead of as the first sheet (maximum 200 sheets in a workbook)

  sourceSS.insertSheet(name, 199, {template: origSheet}); 
  

//note that this function yields SheetName, SheetName_1 ... 
//instead of SheetName, SheetName [OLD], SheetName [OLD 2] ... 

function getFirstUnusedName(sourceSS, name) {
  var existingSheet = sourceSS.getSheetByName(name);
  if (!existingSheet) {
    return name;
  } else {
    name =  name + "_1";
    existingSheet = sourceSS.getSheetByName(name);
    //if already appended _1, loop to find lowest unused number
    while (existingSheet) {
          nameNum = parseInt( name.split('_').pop() ) + 1;
          //the following line does assume there is only one '_' in the sheetname
          //if necessary change the split character(s) to be unique, 
          //or use a regex lookahead instead
          name = name.split('_')[0].toString() + "_" + nameNum.toString();   
          existingSheet = sourceSS.getSheetByName(name);
    }
    return name;
  }
}

这个问题很老了,更通用的功能和解释可能会帮助更多人。但是,如果仍然需要 [OLD]、[OLD 2]、[OLD ]... 的确切顺序,则该函数将遵循。它需要一个额外的条件。

请注意,调用它的主要代码也有所不同。此 main 重命名任何现有工作表并插入一个以日期命名的新空白工作表作为文档中的第一张工作表。

  var sourceSS = SpreadsheetApp.getActiveSpreadsheet();
  var date = new Date().toLocaleDateString();
  var existingSheet = sourceSS.getSheetByName(date);

  //if sheet [date] exists, rename it; make a new sheet named [date]
  var name = getFirstUnusedNameInOldFormat(sourceSS, date);
  if (name != date) { sourceSS.renameActiveSheet(name); }
  sourceSS.insertSheet(date);


function getFirstUnusedNameInOldFormat(sourceSS, name) {
  var existingSpreadsheet = sourceSS.getSheetByName(name);
  if (!existingSpreadsheet) {
    return name;
  } else {
    name = name + " [OLD]"; //the initial [OLD] instead of _1 or [OLD 1] requires an additional conditional
    existingSpreadsheet = sourceSS.getSheetByName(name);
    if (!existingSpreadsheet) {
      return name;
    } else {
      name = name.split(" [OLD]")[0] + " [OLD 2]"; //note desired behavior is to skip appending [OLD 1]
      existingSpreadsheet = sourceSS.getSheetByName(name);
      while (existingSpreadsheet) {
        nameNum = parseInt( name.split(" [OLD ").pop().slice(0,-1) ) + 1;
        name = name.split(" [OLD ")[0].toString() + " [OLD " + nameNum.toString() + "]";   
        existingSpreadsheet = sourceSS.getSheetByName(name);
      }
      return name;
    }
  }
}