Камрады, всем добрый вечер.
Есть вопрос:
И так, есть некий код, который выполняет выгрузку из МойСклад в таблицу, но что я заметил, что есть некие ограничения по выгрузке, либо по времени, либо кол-ву символов.
Так вот, есть ли вообще способы обойти данные ограничения?
Пробовал запускать скрипт с момента остановы по критерию 1 минуты, не дает, сбрасывается на начало.
В данный момент код следующий:
Есть вопрос:
И так, есть некий код, который выполняет выгрузку из МойСклад в таблицу, но что я заметил, что есть некие ограничения по выгрузке, либо по времени, либо кол-ву символов.
Так вот, есть ли вообще способы обойти данные ограничения?
Пробовал запускать скрипт с момента остановы по критерию 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
( ´ ∀ `)ノ~ ♡
( ´ ∀ `)ノ~ ♡