将Google Sheet导出为TXT文件(固定宽度)

时间:2014-04-07 16:10:56

标签: google-apps-script google-docs

我正在尝试使用Google电子表格中的某些宏从Excel文档复制某些功能。最终目标是导出固定宽度的txt文件。不幸的是,供应商无法使用CSV文件。那么,有没有人知道使用Google Scripts生成固定宽度TXT文件的方法?

3 个答案:

答案 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)

这将有效:

  1. 将工作表导出为xlsx,然后在Excel中打开该文件。
  2. 出于某种原因,将该文件导出为Space Delimited Text.prn)。
  3. 将结果文件的文件扩展名更改为.txt
  4. 这将产生如下文件:

    Column    Another   Column 3
    Val 1            2  $    5.00
    

    或者您是否需要直接从Google Apps脚本中获取.txt文件?

    修改,因为需要直接.txt下载。

    以下是设计脚本的方法:

    1. 找到将sheet.getColumnWidth(n)转换为多个空格的方法。你可能会发现有5个像素到1个字符,或者不管比例
    2. 为每列运行getColumnWidth()以查找每列所需的宽度。 或者,找到每个单元格中长度最长的字符串。
    3. 浏览每个单元格并将其添加到您开始构建的大字符串中。在添加时,添加必要的空格数以匹配从getColumnWidth()转换的值。在每一行的末尾,添加\n以表示新行。
    4. 输出字符串完成后,您可以使用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);