• Как ежедневно автоматически сохранять значение столбцов в Google Таблицах?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Как вариант

    const SETTINGS = {
      bookId: '1la6H9omAvlKuMkt-jwZGkp23K0wvV-9CXK9Kq1S0sTw',
      dataSheetNames: ['Лист1', 'Лист2'],
      archiveSheetName: ['Вывод данных'],
    };
    
    function createTrigger() {
      ScriptApp.getProjectTriggers().forEach(
        (trigger) =>
          trigger.getHandlerFunction() === 'saveData' &&
          trigger.getEventType() === ScriptApp.EventType.CLOCK &&
          (ScriptApp.deleteTrigger(trigger) || console.info(`Tirgger ${trigger.getUniqueId()} was deleted`))
      );
      ScriptApp.newTrigger('saveData').timeBased().atHour(17).everyDays(1).create();
    }
    function saveData() {
      const book = SpreadsheetApp.openById(SETTINGS.bookId);
    
      const date = new Date();
      const sheet = book.getSheetByName(SETTINGS.archiveSheetName);
    
      // console.log(book);
    
      SETTINGS.dataSheetNames.forEach((name) => {
        const sheetD = book.getSheetByName(name);
        const values = sheetD.getRange('A2:B').getValues();
        saveData_(sheet, date, values);
      });
      console.info(`saveData was called successful`);
    }
    
    /**
     * @param {globalThis.SpreadsheetApp.Sheet} sheet
     * @param {Date} x
     * @param {any[][]} values
     */
    function saveData_(sheet, x, values) {
      const tz = sheet.getParent().getSpreadsheetTimeZone();
      const x_ = Utilities.formatDate(x, tz, 'dd.MM.yyyy');
      const data = sheet.getDataRange().getValues();
      const ys = data.map((row) => row[0]);
      const xs = data[0].map((cell) => (cell && cell.getTime ? Utilities.formatDate(cell, tz, 'dd.MM.yyyy') : ''));
      let indexX = xs.indexOf(x_);
      if (indexX === -1) indexX = sheet.getLastColumn();
      const preData = data.map((row) => [row[indexX] || '']);
      preData[0][0] = preData[0][0] || x;
      console.log(preData);
      values.forEach((row) => {
        if (row[0] !== '') {
          const index = ys.indexOf(row[0]);
          if (index !== -1) {
            preData[index] = [preData[index][0] || row[1]];
          }
        }
      });
      console.log(JSON.stringify(preData));
    
      sheet.getRange(1, indexX + 1, preData.length, 1).setValues(preData);
    }


    Хоть мне и кажется, что я не продумал мелочи, т.к. подпись к полю на каждом листе должна быть уникальна. Но это можно поправить, автоматически добавляя имя листа, например.

    Пример в Таблице https://docs.google.com/spreadsheets/d/1la6H9omAvl...
    Ответ написан
    Комментировать