2014-04-07 106 views
0

我試圖使用Google Spreadsheet中的一些宏從Excel文檔複製某些功能。最終目標是導出一個固定寬度的txt文件。不幸的是,供應商無法使用CSV文件。那麼,有沒有人知道使用Google腳本生成固定寬度TXT文件的方法?將Google表格導出爲TXT文件(固定寬度)

回答

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 

或者你需要直接獲得一個.txt文件了谷歌Apps腳本的?

編輯因爲需要直接下載.txt

這裏是你如何可以設計一個腳本來做到這一點:

  1. 找到一個方法來sheet.getColumnWidth(n)轉換爲數字的空間。您可能會發現每個列有5個像素到1個字符或任何比例
  2. 運行getColumnWidth()可找到每列需要的寬度。 或者,在每個單元格中查找長度最長的字符串。
  3. 遍歷每個單元格並將其添加到您開始構建的大字符串中。添加它時,請添加匹配從getColumnWidth()轉換的值所需的空格數。在每行末尾,附加\n以表示新行。

一旦輸出字符串是完整的,然後你可以使用Content Service下載的文本像這樣:

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

這將涉及部署腳本的Web應用程序,它可以很好地工作 - 你'轉到URL並且頁面會觸發固定寬度文件的下載。

+0

不幸的是,我需要直接從谷歌文本文件。 – MSCF

+0

是否可以直接下載鏈接:https://drive.google.com/uc?export = download&id =?如何獲得谷歌腳本數據這樣的網址? – user1788736

相關問題