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