Как создать файл CSV из выбранного диапазона в Google Sheets? - PullRequest
0 голосов
/ 14 мая 2019

Мы переносим наши информационные системы из Excel в Google Sheets, и важной частью этого процесса является функциональность для создания нескольких файлов CSV, основанных на нескольких различных диапазонах (на данный момент это может быть просто задано как статический диапазон, например "B8: K500""), каждый CSV-файл называется соответствующей валютой.Мы используем это для отправки платежной ведомости, которую мы затем загружаем в PayPal, которая выплачивается с необходимой информацией ([Электронная почта], [Валюта], [Сумма в долларах] {возврат каретки для следующего сотрудника})

У нас былоэта функциональность уже настроена в VBA, как показано внизу, но я не очень разбираюсь в Javascript, тем более в Google Apps Script, и я не уверен, с чего начать.

Я нашел пример кода, который почти готов, но когда я его запускаю, он показывает ошибку «Указанный диапазон должен быть частью листа. (Строка 5, файл« Csv New »)» и после отладки показывает(папка, i, sheet, и csvFile) переменные, как неопределенные с (диапазон), перечисленным как (Object (1951973745)).Этот код можно найти здесь:

function ExportCSV() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var range = ss.getSheets()[0].getRange("B8:K500");
   SpreadsheetApp.setActiveRange(range);

  // create a folder from the name of the spreadsheet
  var folder = DriveApp.createFolder(ss.getName().toLowerCase().replace(/ /g,'_') + '_csv_' + new Date().getTime());
  for (var i = 0 ; i < sheets.length ; i++) {
    var sheet = sheets[i];
    // append ".csv" extension to the sheet name
    fileName = sheet.getName() + ".csv";

    // convert all available sheet data to csv format
    var csvFile = convertRangeToCsvFile_(fileName, sheet);

    // create a file in the Docs List with the given name and the csv data
    folder.createFile(fileName, csvFile);
  }
  Browser.msgBox('Files are waiting in a folder named ' + folder.getName());
}


function convertRangeToCsvFile_(csvFileName, sheet) {  
   // get available data range in the spreadsheet
  var range = sheet.getRange("B8:K500"); 
  var values = SpreadsheetApp.getActiveSheet().getRange("B8:K500").getValues();

  var csvFile = values;
  DriveApp.createFile("mycsv.csv", csvFile);

  }

Может ли это быть проблемой с разрешениями, связанной с тем, опубликована она или нет?Я обнаружил похожие проблемы в StackOverflow, например:

Скрипт Google Не удается вызвать FormApp.getUi () из этого контекста

Как экспортировать лист Google в формате CSVпо выбранным столбцам

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

Дайте мне знать, если я смогу предоставить любую другую информацию!

Спасибо:)

Связанный код VBA:

Sub WritePaypal(ByVal thisRange As Range, ByVal filePath As String, Optional ByVal fileAppend As Boolean = False)
    Dim cLoop As Long, rLoop As Long
    Dim ff As Long, strRow As String

    ff = FreeFile
    If fileAppend Then
        Open filePath For Append As #ff
    Else
        Open filePath For Output As #ff
    End If

    For rLoop = 1 To thisRange.Rows.Count
        strRow = ""
        For cLoop = 1 To thisRange.Columns.Count
            If cLoop > 1 Then strRow = strRow & vbTab
            strRow = strRow & thisRange.Cells(rLoop, cLoop).Value
        Next                                     'cLoop
        Print #ff, strRow
    Next                                         'rLoop

    Close #ff

    Range("A1").Activate
    MsgBox "Done"
End Sub

Sub WriteFile(ByVal curr As String, ByVal rng As Range)
    Dim myPath As String
    Dim filePath As String
    Dim myrng As Range
    Dim Cell As Range

    'Initialize
    myPath = ""


    ' User chooses path to save .txt file to
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Select Location to Save File to"
        .AllowMultiSelect = False
        If .Show <> -1 Then GoTo NextCode
        myPath = .SelectedItems(1) & Application.PathSeparator
    End With


    'In Case of Cancel
NextCode:
    If myPath = "" Then Exit Sub

    filePath = myPath & curr & ".txt"

    'To Test
    'MsgBox myPath
    'MsgBox filePath


    On Error Resume Next
    Set myrng = rng

    If myrng Is Nothing Then
        MsgBox "No cells selected"
        Exit Sub
    Else
        WritePaypal myrng, filePath, False
    End If

    ScreenUpdating = True


End Sub

Sub WriteUSD()
    Call WriteFile("USD", Range("Z5:AB26"))
End Sub

Sub WriteAUD()
    Call WriteFile("AUD", Range("Z30:AB32"))
End Sub

Sub WriteGBP()
    Call WriteFile("GBP", Range("Z35:AB35"))
End Sub

1 Ответ

0 голосов
/ 15 мая 2019

Вы должны использовать getActiveRangeList(), что позволит вам получить множественные выборы, сделанные пользователем.Из этих диапазонов вы можете получить значения , а затем скомпилировать CSV.

Я приложил пример кода ниже, который очень простым способом показывает вам, как это сделать.Обратите внимание, что он не обрабатывает случаи, когда выборки имеют разные размеры (например, вы выбрали 5 электронных писем, но 20 долларовых сумм).Пример кода также не включает ваши существующие функции для создания / именования папок или окна сообщения.

function createCsvFromSelections() {
  var activeRanges = SpreadsheetApp.getActiveRangeList().getRanges();
  var mergedData = [];

  // Loop through the ranges, rows, and columns in that order so that the
  // values can be recorded in the correct order.
  for (var i in activeRanges) {
    var values = activeRanges[i].getValues(); // 2-d array, row[]col[]
    for (var rowIndex in values) {
      var row = values[rowIndex];
      if (!Array.isArray(mergedData[rowIndex])) // Check if a row was already created
          mergedData[rowIndex] = []; // Add a blank row to push the values into
      for (var colIndex in row) {
        mergedData[rowIndex].push(row[colIndex]);
      }
    }
  }

  // Convert mergedData array to CSV string
  var csvData = "";
  for (var rowIndex in mergedData) {
    csvData += (mergedData[rowIndex].join(",") + "\n");
  }

  // Create the file
  DriveApp.createFile("2019-05-15 Selections", csvData, MimeType.CSV);
}
...