Загрузка данных


const FOLDER_NAME = 'Listate CRM — исходный код';
const NAME_PATTERN = /^listate-crm-[0-9A-Za-z._-]+$/;
const MAX_BYTES = 50 * 1024 * 1024;

function doPost(e) {
  const props = PropertiesService.getScriptProperties();

  let request;
  try {
    request = JSON.parse(e.postData.contents);
  } catch (err) {
    return reply('bad-request');
  }
  if (!request.token || request.token !== props.getProperty('TOKEN')) {
    return reply('forbidden');
  }

  const files = request.files || [];
  const blobs = [];
  for (const file of files) {
    if (!NAME_PATTERN.test(file.name)) return reply('bad-name');
    const bytes = Utilities.base64Decode(file.data);
    if (bytes.length > MAX_BYTES) return reply('too-big');
    blobs.push(Utilities.newBlob(bytes, 'application/octet-stream', file.name));
  }

  const folder = DriveApp.getFolderById(props.getProperty('FOLDER_ID'));
  const saved = blobs.map((blob) => folder.createFile(blob).getName());
  return reply('ok', saved);
}

// Запускается один раз руками: создаёт папку и пароль.
function setup() {
  const props = PropertiesService.getScriptProperties();
  if (!props.getProperty('FOLDER_ID')) {
    props.setProperty('FOLDER_ID', DriveApp.createFolder(FOLDER_NAME).getId());
  }
  if (!props.getProperty('TOKEN')) {
    props.setProperty('TOKEN', Utilities.getUuid() + Utilities.getUuid());
  }
  Logger.log('Пароль для разработчика: ' + props.getProperty('TOKEN'));
}

function reply(status, files) {
  return ContentService
    .createTextOutput(JSON.stringify({ status: status, files: files || [] }))
    .setMimeType(ContentService.MimeType.JSON);
}