Мы переносим наши информационные системы из 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