Страницы: 1
RSS
Google Sheets, Гугл Таблицы
 
Камрады, всем добрый вечер.

Есть вопрос:
И так, есть некий код, который выполняет выгрузку из МойСклад в таблицу, но что я заметил, что есть некие ограничения по выгрузке, либо по времени, либо кол-ву символов.

Так вот, есть ли вообще способы обойти данные ограничения?

Пробовал запускать скрипт с момента остановы по критерию 1 минуты, не дает, сбрасывается на начало.

В данный момент код следующий:
Код
function onOpen() {
 var ui = SpreadsheetApp.getUi();
 ui.createMenu('Мой склад')
    .addItem('Запустить скрипт', 'runScript')
    .addToUi();
}

function runScript() {
 clearCells();
 var dates = promptDates(); // Запрашиваем дату и время перед началом выполнения скрипта
 getProductInfo(dates.date, dates.time); // Передаем выбранную дату и время в функцию getProductInfo
}

function getProductInfo(date, time) {
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var lastRow = sheet.getLastRow();
 var ui = SpreadsheetApp.getUi();
 var outputColumnQuantity = 13;
 var outputColumnPrice = 19;
 var calcColumnR = 18;
 var calcColumnQ = 17;
 var outputColumnIP = 22;
 var startRow = 4;

 var start = new Date();
 var ip = getIPAddress();

 var startMessage = 'Выполнение скрипта начато. Скрипт начал выполняться с IP-адреса: ' + ip + '. Это может занять некоторое время.';
 ui.alert('Выполнение скрипта', startMessage, ui.ButtonSet.OK);

 var deletedRowsData = []; // Массив для хранения информации об удаленных строках

 for (var i = startRow; i <= lastRow; i++) {
    var searchTerm = sheet.getRange(i, 5).getValue();

    if (searchTerm !== "" && searchTerm !== null) {
      var token = 'ТУТ_ЕСТЬ_ТОКЕН';
      var headers = { 'Authorization': 'Bearer ' + token };
      var baseUrl = 'https://online.moysklad.ru/api/remap/1.2/entity/assortment';
      var url = baseUrl + '?filter=code=' + searchTerm + '&expand=stocks,salePrices';
      var response = UrlFetchApp.fetch(url, { headers: headers });
      var jsonResponse = JSON.parse(response.getContentText());

      var stock = '';
      var salePriceFree = '';
      var ip = response.getHeaders()['X-Forwarded-For'] || '';

      if (jsonResponse.rows && jsonResponse.rows.length > 0) {
        var stockValue = jsonResponse.rows[0].stock;

        if (stockValue !== null && stockValue !== undefined) {
          stock = stockValue;

          if (stockValue === 0 || stockValue <= 20) {
            deletedRowsData.push({
              code: searchTerm,
              name: jsonResponse.rows[0].name,
              quantity: stockValue,
              row: i
            });
            sheet.deleteRow(i); // Удаляем строку, если остаток равен 0 или меньше 20
            lastRow--; // Уменьшаем переменную lastRow, так как количество строк в таблице уменьшилось
            i--; // Уменьшаем переменную i, чтобы корректно перейти к следующей строке после удаления
            continue; // Пропускаем остальную часть цикла после удаления строки
          }
        } else {
          stock = '';
        }

        var salePrices = jsonResponse.rows[0].salePrices || [];
        for (var j = 0; j < salePrices.length; j++) {
          if (salePrices[j].priceType && salePrices[j].priceType.name === "Свободная") {
            salePriceFree = (salePrices[j].value / 100).toFixed(2).replace('.', ',');
            break;
          }
        }
      }

      sheet.getRange(i, outputColumnQuantity).setValue(stock);
      sheet.getRange(i, outputColumnPrice).setValue(salePriceFree);

      var price = parseFloat(salePriceFree.replace(',', '.'));
      var priceR = (price * 0.97).toFixed(2).replace('.', ',');
      var priceQ = (price * 0.93).toFixed(2).replace('.', ',');

      sheet.getRange(i, calcColumnR).setValue(priceR);
      sheet.getRange(i, calcColumnQ).setValue(priceQ);
      sheet.getRange(i, outputColumnIP).setValue(ip);

      // Вызываем функцию для выбора даты и времени для каждой строки
      sheet.getRange(i, 11).setValue(date); // Записываем выбранную дату в столбец K
      sheet.getRange(i, 12).setValue(time); // Записываем выбранное время в столбец L
    }
  }

 var rowsToDeleteCount = deletedRowsData.length;
 ui.alert('Удаление строк', 'Будет удалено строк: ' + rowsToDeleteCount, ui.ButtonSet.OK);

 if (rowsToDeleteCount > 0) {
    var csvContent = "Код | Наименование | Остаток | Номер строки\n";
    deletedRowsData.forEach(function (row) {
      csvContent += row.code + " | " + row.name + " | " + row.quantity + " | " + row.row + "\n";
    });

    var fileName = "Удаленные_строки.csv";
    var mimeType = "text/csv";
    var blob = Utilities.newBlob(csvContent, mimeType, fileName);
    var csvData = Utilities.base64Encode(blob.getBytes());
    var fileUrl = "data:" + mimeType + ";base64," + csvData;
    var fileLink = '<a href="' + fileUrl + '" download="' + fileName + '">Скачать файл</a>';
    var dialogTitle = 'Файл CSV создан';
    var htmlOutput = '<script>' +
      'function closeDialog() {' +
      '  google.script.host.close();' +
      '}' +
      '</script>' +
      fileLink +
      '<script>' +
      'document.querySelector("a").addEventListener("click", closeDialog);' +
      '</script>';

    var html = HtmlService.createHtmlOutput(htmlOutput);
    html.setWidth(300);
    html.setHeight(80);
    SpreadsheetApp.getUi().showModelessDialog(html, dialogTitle);
  } else {
    ui.alert('Удаление строк', 'Без остатка и остаток 20 и меньше не найдено строк для удаления.', ui.ButtonSet.OK);
  }

 var end = new Date();
 var executionTime = (end - start) / 1000;
 var endMessage = 'Скрипт завершен. На выполнение скрипта затрачено ' + executionTime + ' секунд.';
 ui.alert('Скрипт завершен', endMessage, ui.ButtonSet.OK);
}

function promptDates() {
 var ui = SpreadsheetApp.getUi();
 var response = ui.prompt('Введите дату (формат: ДД.ММ.ГГГГ)', ui.ButtonSet.OK_CANCEL);
 var dateInput = '';
 var timeInput = '';

 if (response.getSelectedButton() === ui.Button.OK) {
    dateInput = response.getResponseText();

    var timeResponse = ui.prompt('Введите время (формат: ДД.ММ.ГГГГ ЧЧ:ММ:СС)', ui.ButtonSet.OK_CANCEL);

    if (timeResponse.getSelectedButton() === ui.Button.OK) {
      timeInput = timeResponse.getResponseText();
    }
  }

 return {
    date: dateInput,
    time: timeInput
  };
}

function clearCells() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
 var startRow = 4;
 var endRow = sheet.getLastRow();
 var columnsToClear = [11, 12, 13, 17, 18, 19]; // K, L, M, Q, R, S

 for (var colIndex of columnsToClear) {
    var range = sheet.getRange(startRow, colIndex, endRow - startRow + 1);
    range.clearContent();
  }
}

// Функция для получения IP-адреса пользователя
function getIPAddress() {
 var ipAddress = '';
 try {
    var ipResponse = UrlFetchApp.fetch('https://api64.ipify.org?format=json');
    var json = JSON.parse(ipResponse.getContentText());
    ipAddress = json.ip || '';
  } catch (error) {
    ipAddress = '';
  }
 return ipAddress;
}

Нужна помощь? Пиши в ЛС, всегда помогу чем смогу за Волшебную Балтику 3
( ´ ∀ `)ノ~ ♡
Страницы: 1
Наверх