Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
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
( ´ ∀ `)ノ~ ♡
Ошибка выполнения надстройки
 
Добрый день.

Есть надстройка, если запускать код из файла .xlsm то все прекрасно работает и обрабатывает.
Но, если сделать надстройку и добавить меню помощью RibbonXMLEditor, то он начинает создавать листы и обрабаывать внутри себя, а не на активном открытом листе/книге.

Прошу вас подсказать, что я сделал неверно?
Код
Private Sub DeleteCol(control As IRibbonControl)
    Call MergeAndProcessData
End Sub

'Это готовый вариант 1 части выполнения
Sub MergeAndProcessData()
    Dim selectedFiles As FileDialog
    Dim fileName As Variant
    Dim mergedData() As Variant
    Dim headerRow() As Variant
    Dim totalRows As Long
    Dim currentRow As Long
    Dim ws As Worksheet
    Dim i As Long, j As Long
    Dim lastRow As Long
    Dim sumQty As Double
    Dim curBlock As String
    Dim curName As String

    Set selectedFiles = Application.FileDialog(msoFileDialogFilePicker)
    selectedFiles.AllowMultiSelect = True

    If selectedFiles.Show = -1 Then
        totalRows = 0
        Dim totalCols As Long
        For Each fileName In selectedFiles.SelectedItems
            Workbooks.Open fileName
            totalRows = totalRows + ActiveSheet.UsedRange.Rows.Count - 1
            totalCols = ActiveSheet.UsedRange.Columns.Count
            ActiveWorkbook.Close SaveChanges:=False
        Next fileName

        ReDim mergedData(1 To totalRows, 1 To totalCols)
        ReDim headerRow(1 To 1, 1 To totalCols)

        currentRow = 1

        For Each fileName In selectedFiles.SelectedItems
            Workbooks.Open fileName
            If currentRow = 1 Then
                For j = 1 To totalCols
                    headerRow(1, j) = ActiveSheet.Cells(1, j).Value
                Next j
            End If
            For i = 2 To ActiveSheet.UsedRange.Rows.Count
                If ActiveSheet.Cells(i, 16).Value <> "Отклонено" Then
                    For j = 1 To totalCols
                        mergedData(currentRow, j) = ActiveSheet.Cells(i, j).Value
                    Next j
                    currentRow = currentRow + 1
                End If
            Next i
            ActiveWorkbook.Close SaveChanges:=False
        Next fileName

        Set ws = ThisWorkbook.Worksheets.Add
        ws.Range("A1").Resize(UBound(headerRow, 1), UBound(headerRow, 2)).Value = headerRow
        ws.Range("A2").Resize(currentRow - 1, UBound(mergedData, 2)).Value = mergedData

        ws.Columns("U:R").Delete
        ws.Columns("P:P").Delete
        ws.Columns("H:C").Delete
        ws.Columns("A:A").Delete

        lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
        For i = lastRow To 2 Step -1
            curBlock = ws.Cells(i, 3).Value
            curName = ws.Cells(i, 6).Value
            sumQty = ws.Cells(i, 9).Value
            For j = i - 1 To 1 Step -1
                If ws.Cells(j, 3).Value = curBlock And ws.Cells(j, 6).Value = curName Then
                    sumQty = sumQty + ws.Cells(j, 9).Value
                    ws.Rows(j).Delete
                    i = i - 1
                    lastRow = lastRow - 1
                End If
            Next j
            ws.Cells(i, 9).Value = sumQty
        Next i

        Dim startingColumn As Long
        startingColumn = 10 
        ws.Cells(1, startingColumn).Value = "Остаток, шт."
        ws.Cells(1, startingColumn + 1).Value = "Процент продаж"
        ws.Cells(1, startingColumn + 2).Value = "Казань"
        ws.Cells(1, startingColumn + 3).Value = "НН"
        ws.Cells(1, startingColumn + 4).Value = "Москва"
        ws.Cells(1, startingColumn + 5).Value = "Краснодар"

        Dim lastRowProcessed As Long
        lastRowProcessed = ws.Cells(Rows.Count, 1).End(xlUp).Row
        For i = lastRowProcessed To 2 Step -1
            block= ws.Cells(i, 3).Value
            count= ws.Cells(i, 9).Value
            If block= "April Cash&Carry" Then
                ws.Cells(i, 12).Value = count
            ElseIf block= "April cash&carry (Москва)" Then
                ws.Cells(i, 14).Value = count
            ElseIf block= "April Cash&Carry (Нижний Новгород)" Then
                ws.Cells(i, 13).Value = count
            ElseIf block= "Цветы Краснодара" Then
                ws.Cells(i, 15).Value = count
            End If
            For j = i - 1 To 2 Step -1
                If ws.Cells(j, 6).Value = ws.Cells(i, 6).Value Then
                    ws.Cells(j, 12).Value = ws.Cells(j, 12).Value + ws.Cells(i, 12).Value 
                    ws.Cells(j, 13).Value = ws.Cells(j, 13).Value + ws.Cells(i, 13).Value 
                    ws.Cells(j, 14).Value = ws.Cells(j, 14).Value + ws.Cells(i, 14).Value 
                    ws.Cells(j, 15).Value = ws.Cells(j, 15).Value + ws.Cells(i, 15).Value 
                    ws.Rows(i).Delete
                    Exit For
                End If
            Next j
        Next i

        For i = 2 To lastRowProcessed
            ws.Cells(i, 9).Value = ws.Cells(i, 12).Value + ws.Cells(i, 13).Value + ws.Cells(i, 14).Value + ws.Cells(i, 15).Value
        Next i

        For i = 2 To lastRowProcessed
            If IsEmpty(ws.Cells(i, 12).Value) Then ws.Cells(i, 12).Value = 0 
            If IsEmpty(ws.Cells(i, 13).Value) Then ws.Cells(i, 13).Value = 0 
            If IsEmpty(ws.Cells(i, 14).Value) Then ws.Cells(i, 14).Value = 0 
            If IsEmpty(ws.Cells(i, 15).Value) Then ws.Cells(i, 15).Value = 0 
        Next i

        ws.Columns("L").ColumnWidth = 10
        ws.Columns("M").ColumnWidth = 10
        ws.Columns("N").ColumnWidth = 10
        ws.Columns("O").ColumnWidth = 10

        ws.Columns("B:B").Cut
        ws.Columns("I:I").Insert Shift:=xlToRight

        ws.Columns("I:I").Insert Shift:=xlToRight

        ws.Cells(1, 9).Value = "Заявлено, шт."
        ws.Cells(1, 11).Value = "Остаток, шт."

        ws.Cells(1, 5).Value = "Наименование Предзаказа"
        ws.Cells(1, 8).Value = "Менеджер по закупке"
        ws.Cells(1, 10).Value = "Куплено, шт."

        ws.Cells.EntireColumn.AutoFit

        Set selectedFiles = Nothing
        Set ws = Nothing
    End If

End Sub


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

Имеется 2 листа.
Лист1 "МС"
Лист2 "Клик"

На листе 2 в столбце A есть ФИО контрагента (далее КА)/(Формат ИП Иванов И.И.)
На листе 1 есть ФИО КА но в другом формате.(ИП Иванов Иван Иванович/ИП Иванов Иван Иванович (Нет договора)/ФЛ Иванов Иван Иванович/ ООО ИП Иванов)

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

Критерии:
1. Совпадение Фамилии
2. Совпадение даты

Если совпадает, нужно перенести значение, если даты не совпадают и/или нет фамилии, то на листе2 выделить эту ячейку красным

Более детальный пример во вложении.

Благодарю всех за помощь.  
Изменено: Егор Чернов - 05.07.2023 01:58:39
Нужна помощь? Пиши в ЛС, всегда помогу чем смогу за Волшебную Балтику 3
( ´ ∀ `)ノ~ ♡
Вставка суммы по контрагенту на лист с менеджеров
 
Добрый день.

Прошу подсказать.

Этот код делает следующее. На листе с менеджера удаляет одинаковые строки по наименованию, а сумму суммирует и вписывает в строку.
Так же, разделяет пустой строкой между контрагентами. В эту пустую строку вставляется сумма по контрагенту из листа "Sheet" из столбца H .
Так вот, вставлять то вставляет, но совсем не то, что нужно. Где ошибка, понять не могу. Буду рад любой помощи.

Файл с примером, прикрепил.
Код
Sub RemoveDuplicatesAndSumQuantities()
    ' Определение переменных
    Dim lastRow As Long
    Dim i As Long
    Dim j As Long
    Dim sumQty As Long
    Dim curQty As Long
    Dim curAgent As String
    Dim startTime As Double
    
    ' Запоминание времени начала выполнения скрипта
    startTime = Timer
    
    ' Получение номера последней строки в таблице
    lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    
    ' Перебор строк в таблице
    For i = lastRow To 2 Step -1
        ' Получение значения агента и количества для текущей строки
        curAgent = Cells(i, 1).Value
        sumQty = 0
        
        ' Перебор предыдущих строк
        For j = i - 1 To 1 Step -1
            ' Если агент и товар совпадают, то суммируем количества и удаляем предыдущую строку
            If Cells(j, 1).Value = curAgent And Cells(j, 2).Value = Cells(i, 2).Value Then
                sumQty = sumQty + Cells(j, 3).Value
                Rows(j).Delete
                i = i - 1
                lastRow = lastRow - 1
            End If
        Next j
        
        ' Добавление количества текущей строки к сумме
        sumQty = sumQty + Cells(i, 3).Value
        
        ' Присваивание нового значения количества текущей строке
        Cells(i, 3).Value = sumQty
        
        ' Добавление пустой строки после группы одинаковых агентов
        If i > 2 And Cells(i, 1).Value <> Cells(i - 1, 1).Value Then
            Rows(i).Insert
            Cells(i, 2).Value = "Итого:"
            Cells(i, 3).Value = WorksheetFunction.SumIf(Sheets("Sheet").Range("A:A"), curAgent, Sheets("Sheet").Range("H:H"))
        End If
    Next i
    
    ' Добавление сообщения об успешном завершении скрипта и времени выполнения
    Dim timeElapsed As String
    timeElapsed = Format((Timer - startTime), "0.00")
    MsgBox "Результат работы скрипта" & vbCrLf & _
        "Скрипт выполнен успешно!" & vbCrLf & _
        "Время выполнения: " & timeElapsed & " секунд" & vbCrLf & _
        "От модератора, с любовью.", vbInformation, "Результат работы скрипта"
End Sub
Нужна помощь? Пиши в ЛС, всегда помогу чем смогу за Волшебную Балтику 3
( ´ ∀ `)ノ~ ♡
Вычет остатков по наименованию
 
Добрый день.
Прошу вашей помощи. Есть 2 листа. 1 лист факт купленных позиций, 2 лист остаток. Требуется на листе 1 в столбце "корр остаток" произвести вычет.
Допустим: Лист1 Корзина 10, Лист2 Корзина 30, в столбце "Корр остаток" должно быть 20
Файл пример прикрепил.
Нужна помощь? Пиши в ЛС, всегда помогу чем смогу за Волшебную Балтику 3
( ´ ∀ `)ノ~ ♡
Подсчет позиций основываясь на справочник с выпадающим списком
 
Добрый день.

Прошу вашей помощи. Во вложении тест файл с тем, что требуется(Лист: СВОД)
Имеется выгрузка покупок(Лист: Выгрузка) и справочник(Лист: Справочник), где хранится вся номенклатура.

Требуется в СВОДе реализовать выбор города, выбор позиции и чтоб в графе кол-во отображалась сумма купленных.

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

В данный момент использую функцию "ЕСЛИ", но так как много значений в раскрывающемся списке, формула растягивается.
Есть ли возможно как то сократить формулу?
Или же есть вариант через script реализовать данный момент.
Ссылку прикрепил. Столбец выделил желтым
Спасибо.

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