@SAV21rus

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

Изучив тему https://qna.habr.com/answer?answer_id=1834719#answ... и https://qna.habr.com/answer?answer_id=2089582#answ... попробовал сделать тоже самое только применительно к столбцам и выводу значений по дате и по столбцам, не получилось.
Суть вопроса есть в таблицах Лист1 диапазон A2:A25 там записано название данных, есть диапазон B2:B25 там сами данные. Есть Лист2 диапазон A2:A25 (не совпадает с Лист1) там записано название данных, есть диапазон B2:B25 там сами данные. Хотелось бы переносить на Лист3 текстовое значение из Лист1 A2:A25 и Лист2 A2:A25 данные формата B1 - дата переноса данных и в ячейках B2:B25 сами данные.
function createTrigger() {
ScriptApp.getProjectTriggers().forEach(
(trigger) =>
trigger.getHandlerFunction() === 'saveData' &&
trigger.getEventType() === ScriptApp.EventType.CLOCK &&
(ScriptApp.deleteTrigger(trigger) ||
console.info(`Tirgger ${trigger.getUniqueId()} was deleted`))
);
// every minutes for testing
//ScriptApp.newTrigger('saveData').timeBased().everyMinutes(1).create();
// at 9 o'clock every days
ScriptApp.newTrigger('saveData').timeBased().atHour(17).everyDays(1).create();
//}
//function saveData() {
// const book = SpreadsheetApp.openById(
// 'IDтаблицы'
// );
// const sheet = book.getSheetByName('Лист1');
// const values = sheet.getRange('C3:AA3').getValues();
// book.getSheetByName('Лист2').appendRow([new Date(), values[0][0], values[0][1], values[0][2], values[0][3], values[0][4], values[0][5], values[0][6], values[0][7]]);
// console.info(`saveData was called successful`);
}
function saveData() {
const book = SpreadsheetApp.openById(
'IDтаблицы'
);
const date = new Date();
const sheetTotal = book.getSheetByName('Лист4');
const sheetGOOG = book.getSheetByName('Лист3');
const valuesGOOG = sheetGOOG.getRange('B2:B25').getValues().map(column => [date, 'Лист1', ...column]);
appendData_(sheetTotal, valuesGOOG);
console.info(`saveData was called successful`);
}

function appendData_(sheet, values) {
if (sheet.getLastColumn() === sheet.getMaxColumns())
sheet.appendRow([]);
sheet.getRange(sheet.getLastColumn() + 1, 1, values.length, values[0].length)
.setValues(values);
}


Вот что получилось пока написать, но работает некорректно хочется видеть в диапазоне A2:A25 название и в B1 Дату со временем переноса данных и в B2:B25 данные
Помогите пожалуйста, только начал изучать Apps Script
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
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...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы