Google Spread Sheet Export CSV в той же папке - PullRequest
2 голосов
/ 20 марта 2020

Я использую приведенный ниже скрипт, работающий очень хорошо (спасибо Теду Беллу). Но мне нужно адаптировать его, потому что мне нужно, чтобы файл CSV сохранялся в той же папке, что и электронная таблица. Не могли бы вы помочь мне с этим вопросом? Приведенный ниже код создает новую папку каждый раз на My Drive. CSV в порядке в отношении своего имени и формата: с разделителем точек с запятой.

function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var csvMenuEntries = [{
    name: "export as csv file",
    functionName: "saveAsCSV"
}];
ss.addMenu("CSV Export", csvMenuEntries);
var a1 = ss.getRange("A1").getValue();
var name = "MyCompanyName_"+a1;
ss.rename(name);
};

function saveAsCSV() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ssname = ss.getName();
var sheet = ss.getActiveSheet();
var sheetname = sheet.getSheetName();
//Logger.log("DEBUG: the name of the spreadsheet is "+ssname);//DEBUG
//Logger.log("DEBUG: the sheet name is "+sheetname);// DEBUG

//// create a folder from the name of the spreadsheet
var folder = DriveApp.createFolder(ssname.toLowerCase() + '_' + 
sheetname.toLowerCase().replace(/ /g, '_') + '_csv_' + new Date().getTime());
//Logger.log("DEBUG: the folder name is "+folder);//DEBUG

// append ".csv" extension to the sheet name
var fileName = ssname + '_' + sheetname + ".csv";

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

// 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 isValidDate(date) {
return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}


function so_4225484202(filename) {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var paramsheet = ss.getSheetByName("Parameters");

var linearray = [];
var rowdata = [];
var csv = "";
var fieldvalue = "";

var param = paramsheet.getRange(2, 2, 2);
var paramValues = param.getValues();
//Logger.log("DEBUG: parameters = "+param.getA1Notation());//DEBUG
var fieldDelimiter = paramValues[0][0];
var textDelimiter = paramValues[1][0];
//Logger.log("DEBUG: field delimiter: "+fieldDelimiter+", text delim: 
"+textDelimiter);//DEBUG
var rangeData = sheet.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();
//Logger.log("DEBUG: lastColumn: "+lastColumn+", lastRow: "+lastRow);//DEBUG

// Get array of values in the Data Range
var rangeValues = rangeData.getValues();

// Loop through array and build values for csv
for (i = 0; i < lastRow; i++) {
    for (j = 0; j < lastColumn; j++) {

        var value = rangeValues[i][j];
        var theType = typeof value;

        if (theType === "object") {
            var testdate = isValidDate(value);
            //Logger.log("if typeof is object: testdate: "+testdate);//DEBUG
            var testtype = typeof testdate;
            if (testtype === "boolean") {
                // variable is a boolean
                //Logger.log("Its a date");//DEBUG
                theType = "date";
            } else {
                //Logger.log("Its not a date");//DEBUG
            }
        }
        if (theType === "string") {
            value = textDelimiter + value + textDelimiter;
        }

        rowdata.push([value]);
    };

    //Logger.log("DEBUG: rowdata: "+rowdata);//DEBUG
    csv += rowdata.join(fieldDelimiter) + "\n";
    var rowdata = [];

};

//Logger.log("DEBUG: csv: "+csv);//DEBUG
return csv;

}

1 Ответ

2 голосов
/ 20 марта 2020
  • Вы хотите создать файл CSV в той же папке активной электронной таблицы.
  • Вы хотите добиться этого, изменив сценарий.

Если я понимаю правильно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точка модификации:

  • Чтобы извлечь папку из активной электронной таблицы, DriveApp.getFileById(ss.getId()).getParents().next() используется для ее извлечения. .

Модифицированный скрипт:

Пожалуйста, измените функцию saveAsCSV() в вашем скрипте следующим образом.

С:
var folder = DriveApp.createFolder(ssname.toLowerCase() + '_' + sheetname.toLowerCase().replace(/ /g, '_') + '_csv_' + new Date().getTime());
Кому:
var folder = DriveApp.getFileById(ss.getId()).getParents().next();

Ссылки :

Если я неправильно понял ваш вопрос, а это не то направление, в котором вы хотите, прошу прощения.

...