Скрипт Google Sheets для дублирования и переименования таблиц - PullRequest
0 голосов
/ 06 июля 2019

Я создаю скрипт в Google Sheets, который будет копировать активный лист и создавать 30 повторяющихся листов в одной книге.Каждый дублированный лист будет иметь другое имя в зависимости от значения в ячейке активного листа.Ячейка будет содержать дату;дублированные листы будут иметь названия дат после даты, указанной в ячейке.Например, ячейка B3 "5/7/2019".Дублированные листы должны иметь имена: «6 июля 2019 года» (B3 + 1), «7 июля 2019 года» (B3 + 2), «8 июля 2019 года» (B3 + 3) и т. Д.

Я использую код, который уже встроен в Google Sheets.Некоторые из них были созданы путем записи макроса, а другие части были созданы благодаря тому, что я мало знаю о программировании и исследованиях в Интернете.

function duplicatesheet(){

//copy active sheet
var as = SpreadsheetApp.getActiveSpreadsheet()
SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet();

//rename sheet
var myValue = 
SpreadsheetApp.getActiveSpreadsheet().getRange('B3').getValue();
SpreadsheetApp.getActiveSpreadsheet().renameActiveSheet(myValue);

}

Код работает, когда дублирует активный лист один раз, но он не создает 30дубликаты.Также неправильно переименовываются листы, как описано выше, на основе даты, указанной в ячейке B3.Мне нужна помощь в создании кода, который будет выполнять обе эти задачи.

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Это отредактировано w.r.t. Комментарии. Вы также можете увидеть отличный ответ от Tedinoz.

Попробуйте этот код:

function duplicatesheet() {
  var as = SpreadsheetApp.getActiveSpreadsheet(); // active spreadsheet
  var s = as.getActiveSheet(); // first sheet object
  var dateCell = "B3"; // cell containing first date
  var N = 30; // number of copies to make

  var startDate = new Date(s.getRange(dateCell).getValue()); // get the date stored in dateCell
  var day = startDate.getDate(); // extract the day
  var month = startDate.getMonth(); // extract the month
  var year = startDate.getFullYear(); // extract the year

  // loop over N times
  for (var i = 0; i < N; i++) {
    var asn = s.copyTo(as); // make a duplicate of the first sheet
    var thisSheetDate = new Date(year, month, day+(i+1)); // store the new date as a variable temporarily

    asn.getRange(dateCell).setValue(thisSheetDate); // writes the date in cell "B3"
    asn.setName(Utilities.formatDate(thisSheetDate, undefined, "MMMMM d, yyyy")); // sets the name of the new sheet
  }
}

Я предлагаю поместить N=30 в что-то маленькое, например N=2, чтобы посмотреть, работает ли оно в первую очередь с вашим форматированием.

Форматирование, используемое здесь методом Utilities.formatDate(), я предположил, что оно будет MMMMM d, yyyy, которое будет печатать имена вкладок в этом формате:

6 июля 2019

Вы можете изменить его по своему усмотрению в соответствии со ссылкой [ 3 ] ниже.


Вы можете увидеть ссылки на все функции, используемые здесь:

1 голос
/ 06 июля 2019

Этот код принимает одну дату, введенную OP в ячейке «B3» имени листа, скажем, «Sheet1», он повторяется тридцать раз, создавая дубликат исходной электронной таблицы, увеличивая имя листа на основе данных на 1 день каждыйвремя.

Для обеспечения точной математики даты предлагается, чтобы формат ячейки "B3" был в том же стиле ("MMMM dd, yyyy"), что и предлагаемые имена листов.


function so5691088602(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "Sheet1";
  var basesheet = ss.getSheetByName(sheetname);
  var newSheetName = new Date(basesheet.getRange("B3").getValue());
  var NumDups = 30;
  for (var i=0;i<NumDups;i++){
    basesheet.activate;
    var tempDate = new Date();
    var printdate01 = Utilities.formatDate(new Date(tempDate.setDate(newSheetName.getDate()+1+i)), "GMT+10", "MMMM dd, yyyy");
    // Logger.log("DEBUG: Sheet Date = "+printdate01);
    ss.insertSheet(printdate01, {template: basesheet});
  }
}

Снимок экрана

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...