我正在尝试使用Google电子表格中的某些宏从Excel文档复制某些功能。最终目标是导出固定宽度的txt文件。不幸的是,供应商无法使用CSV文件。那么,有没有人知道使用Google Scripts生成固定宽度TXT文件的方法?
答案 0 :(得分:2)
以防万一其他人来看。我使用了一些来源并想出了这个:
function saveAsFixedWidthTxt() {
// get Spreadsheet Name
var fileName = SpreadsheetApp.getActiveSpreadsheet().getName();
//var fileName = SpreadsheetApp.getActiveSheet().getSheetName();
// get Directory the Spreadsheet is stored in.
var dirName = DocsList.getFileById(SpreadsheetApp.getActive().getId()).getParents()[0].getName();
// Add the ".txt" extension to the file name
fileName = fileName + ".txt";
// Convert the range data to fixed width format
var txtFile = convertRangeToTxtFile_(fileName);
// Delete existing file
deleteDocByName(fileName);
// Create a file in the Docs List with the given name and the data
DocsList.getFolder(dirName).createFile(fileName, txtFile);
}
function convertRangeToTxtFile_(txtFileName) {
try {
var txtFile = undefined;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var rows = sheet.getDataRange();
var data = rows.getValues();
// Loop through the data in the range and build a string with the data
if (data.length > 1) {
var txt = "";
for (var row = 2; row < data.length; row++) {
for (var j=6; j<=10; j++){
if(data[row][j] != ''){
// Employee ID
var empID = "" + data[row][3];
txt += empID;
//Fill to 6 characters
for (i=empID.length; i<6; i++){
txt += " ";
}
// Name
var fullName = data[row][5] + " " + data[row][4]
txt += fullName;
//Fill to 43 characters
for (i=fullName.length; i<44; i++){
txt += " ";
}
// etc, etc to build out your line
txt += "\r\n";
}
}
}
txtFile = txt;
}
return txtFile;
}
catch(err) {
Logger.log(err);
Browser.msgBox(err);
}
}
function deleteDocByName(fileName){
var docs=DocsList.find(fileName)
for(n=0;n<docs.length;++n){
if(docs[n].getName() == fileName){
var ID = docs[n].getId()
DocsList.getFileById(ID).setTrashed(true)
}
}
}
答案 1 :(得分:1)
这将有效:
xlsx
,然后在Excel中打开该文件。Space Delimited Text
(.prn
)。.txt
。这将产生如下文件:
Column Another Column 3
Val 1 2 $ 5.00
或者您是否需要直接从Google Apps脚本中获取.txt
文件?
修改,因为需要直接.txt
下载。
以下是设计脚本的方法:
sheet.getColumnWidth(n)
转换为多个空格的方法。你可能会发现有5个像素到1个字符,或者不管比例getColumnWidth()
以查找每列所需的宽度。 或者,找到每个单元格中长度最长的字符串。 getColumnWidth()
转换的值。在每一行的末尾,添加\n
以表示新行。输出字符串完成后,您可以使用Content Service下载文本,如下所示:
ContentService.createTextOutput(youBigString).downloadAsFile('filename.txt')
这将涉及将您的脚本部署为Web应用程序,这可以很好地工作 - 您将转到URL,该页面将触发下载固定宽度文件。
答案 2 :(得分:1)
在我的情况下,DocList使用返回ReferenceError。@ MSCF第7和27行:
@MyAnnot("somevalue")
public interface MyClass
{
}
成为
var dirName = DocsList.getFileById(SpreadsheetApp.getActive().getId()).getParents()[0].getName();
DocsList.getFolder(dirName).createFile(fileName, txtFile);