Как автоматически добавлять в скрипт имя листа для повторного использования?

Документы приходят на ежедневной основе (ex. sup-sup-27-07-2021). Моя задача состоит в том, чтобы скрипт применялся к этим документам и создавал сводные таблицы. Названия документов меняются в зависимости от даты.

function createPivot() {
  const doc = SpreadsheetApp.getActive();
  const sheet = doc.getSheetByName('sup-sup-27-07-2021');
  const headers = sheet.getRange('1:1').getValues()[0];
  const colIdx = headers.reduce((o, k, i) => {
    o[k] = i + 1;
    return o;
  }, {});
  const pivotsSheet = doc.insertSheet();

  pivotsSheet.setName('Исп1');

  const pivotTable = pivotsSheet
    .getRange('A1')
    .createPivotTable(sheet.getDataRange());

  let filter = SpreadsheetApp.newFilterCriteria().whenTextContains(['']);

  let groupPivotCriteria = SpreadsheetApp.DateTimeGroupingRuleType.MONTH;
  let groupPivotCriteria1 = SpreadsheetApp.DateTimeGroupingRuleType.DAY_MONTH;
}

Можно ли для каждого нового документа автоматически обновлять строчку в скрипте по имени листа в документе или по названию документа:

(ex.)

  1. Название документа - sup-sup-27-07-2021
  2. Необходимая строка с названием документа или листа(они одинаковые) const sheet = doc.getSheetByName()

Ответы (1 шт):

Автор решения: contributorpw

Вам следует организовать код таким образом, чтобы программа вызывалась из одного места (проекта). Например,

/**
 * @param {GoogleAppsScript.Spreadsheet.Spreadsheet} book
 * @param {string} sheetName
 */
function createPivot_(book, sheetName) {
  const doc = book;
  const sheet = doc.getSheetByName(sheetName) || doc.insertSheet(sheetName);
  const headers = sheet.getRange('1:1').getValues()[0];
  const colIdx = headers.reduce((o, k, i) => {
    o[k] = i + 1;
    return o;
  }, {});
  const pivotsSheet = doc.insertSheet();

  pivotsSheet.setName('Исп1');

  const pivotTable = pivotsSheet
    .getRange('A1')
    .createPivotTable(sheet.getDataRange());

  let filter = SpreadsheetApp.newFilterCriteria().whenTextContains(['']);

  let groupPivotCriteria = SpreadsheetApp.DateTimeGroupingRuleType.MONTH;
  let groupPivotCriteria1 = SpreadsheetApp.DateTimeGroupingRuleType.DAY_MONTH;
}

/**
 *
 */
function userActionCreateTodayPivot() {
  const sheetName = `sup-sup-${Utilities.formatDate(
    new Date(),
    Session.getScriptTimeZone(),
    'dd-MM-yyyy'
  )}`;
  createPivot_(SpreadsheetApp.getActiveSpreadsheet(), sheetName);
}

Хотя, код выше может подойти и для каждого проекта, если отчет создается только сегодня

Если у вас несколько sup-sup-* листов, то можно выбирать последний из них или создавать сегодняшний

/**
 *
 */
function userActionCreatePivot() {
  const book = SpreadsheetApp.getActive();
  const sheetNames = book
    .getSheets()
    .filter((sheet) => /^sup\-sup\-/.test(sheet.getName()));

  const sheetName = sheetNames.length
    ? sheetNames.reverse()[0]
    : `sup-sup-${Utilities.formatDate(
        new Date(),
        Session.getScriptTimeZone(),
        'dd-MM-yyyy'
      )}`;
  createPivot_(SpreadsheetApp.getActiveSpreadsheet(), sheetName);
}
→ Ссылка