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

问题描述 投票:0回答:3

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

google-apps-script google-docs
3个回答
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中打开该文件。
  2. 将该文件导出为Space Delimited Text(由于某种原因,.prn)。
  3. 将结果文件上的文件扩展名更改为.txt

这将导致如下文件:

Column    Another   Column 3
Val 1            2  $    5.00

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

编辑,因为直接下载.txt是必要的。

以下是设计脚本的方法:

  1. 找到一种将sheet.getColumnWidth(n)转换为多个空格的方法。您可能会发现有5个像素到1个字符,或者无论比例如何
  2. 为每列运行getColumnWidth()以查找每列所需的宽度。或者,找到每个单元格中长度最长的字符串。
  3. 浏览每个单元格并将其添加到您开始构建的大字符串中。在添加时,添加匹配从getColumnWidth()转换的值所需的空格数。在每行的末尾,附加\n以表示新行。

输出字符串完成后,您可以使用Content Service下载文本,如下所示:

ContentService.createTextOutput(youBigString).downloadAsFile('filename.txt')

这将涉及将您的脚本部署为Web应用程序,这可能会运行良好 - 您将转到URL,该页面将触发固定宽度文件的下载。


1
投票

在我的例子中,DocList使用返回ReferenceError。@ MSCF你的第7和27行:

var dirName = DocsList.getFileById(SpreadsheetApp.getActive().getId()).getParents()[0].getName();

DocsList.getFolder(dirName).createFile(fileName, txtFile);

成为

var dirName = DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId()).getParents().next().getId();

DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId()).getParents().next().createFile(fileName, txtFile);
© www.soinside.com 2019 - 2024. All rights reserved.