В скрипте Google Sheets Apps, как проверить, существует ли лист, и нет ли его - PullRequest
1 голос
/ 25 сентября 2019

Я создаю электронную таблицу для сортировки событий на основе введенной даты.Я успешно получил программу для добавления нового листа с содержимым события, которое я хочу скопировать, но я не смог добавить в сценарий, чтобы разрешить два варианта.Моя цель - сделать так:

Вариант 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();
    }
}

Если у кого-то есть идеи, почему это не работает, я хотел бы знать.Спасибо!

1 Ответ

1 голос
/ 25 сентября 2019

Функция getSheetByName возвращает null, когда не существует листа с таким именем.Если вы реализуете код таким образом, я думаю, это будет проще.

Код будет выглядеть примерно так:

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...
...