2016-09-02 14 views
0

私はここにあるコードを使用しています: How to convert a Google Docs-File to an Excel-File (XLSX)、さらに具体的にはin this gistを使用してExcelファイルを作成しています。Googleスプレッドシートの行からExcel文書を作成する

コードを変更する必要があります。

  1. google スプレッドシートに新しい行が追加されるたびにExcelファイルを作成します。 現在作業中
  2. 新しいExcelファイルの行1は、ソー​​ススプレッドシートのヘッダーであり、2行目は、 ソーススプレッドシートに追加された新しい行にする必要があります。
  3. ファイルの名前は、新しい行に見出される値に基づくべきで、列2 & 15.ワーキング今
  4. 新しいExcelファイルをフォルダ「フォームの回答」ID = 0B-eAmBjlnU16YTJIVVFpMjJoTzQに入れなければなりません。 ワーキング今
ファイルの名前として、私は最後の行の値を使用するために、新しい行が追加された場合に発生させるコードを変更することができました

、列2 & 15と、新しく作成されたに移動(スプレッドシートの変更、編集、フォーム提出の場合)

 function test_downloadXLS() { 
    var fileId = SpreadsheetApp.openById("ID").getId(); 
    downloadXLS(fileId); 
    var range = SpreadsheetApp.getActiveSheet().getRange('A2:DI2'); 

    var files = DriveApp.getRootFolder().getFiles(); 
    while (files.hasNext()) { 
    var file = files.next(); 
    var destination = DriveApp.getFolderById("0B-eAmBjlnU16YTJIVVFpMjJoTzQ"); 
    destination.addFile(file); 
    var pull = DriveApp.getRootFolder(); 
    pull.removeFile(file); 
    range.clear() 
    } 
} 

/** 
* Downloads spreadsheet with given file id as an Excel file. 
* Uses Advanced Drive Service, which must be enabled. 
* Throws if error encountered. 
* 
* From https://stackoverflow.com/a/27281729/1677912 
* 
* @param {String} fileId  File ID of Sheets file on Drive. 
*/ 
function downloadXLS(fileId) { 
    var file = Drive.Files.get(fileId); 
    var url = file.exportLinks[MimeType.MICROSOFT_EXCEL]; 

var options = { 
    headers: { 
    Authorization:"Bearer "+ScriptApp.getOAuthToken() 
    }, 
    muteHttpExceptions : true  /// Get failure results 
    } 

    var response = UrlFetchApp.fetch(url, options); 
    var status = response.getResponseCode(); 
    var result = response.getContentText(); 
    if (status != 200) { 
    // Get additional error message info, depending on format 
    if (result.toUpperCase().indexOf("<HTML") !== -1) { 
     var message = strip_tags(result); 
    } 
    else if (result.indexOf('errors') != -1) { 
     message = JSON.parse(result).error.message; 
    } 
    throw new Error('Error (' + status + ") " + message); 
    } 

    var ss = SpreadsheetApp.openById('16Vv_FqrZyeCmCoK9XAvujVRisa-5m3FabH5uNAKprYc'); 
    var sh = ss.getSheets()[0];// access first sheet (0 indexed) 
    var row = sh.getLastRow(); 
    var data = sh.getRange(row, 2).getValue(); 
    var row2 = sh.getLastRow(); 
    var data2 = sh.getRange(row, 15).getValue(); 

    var doc = response.getBlob(); 
    DriveApp.createFile(doc).setName(data + "-" + data2 + '.xlsx'); 
} 


// A JavaScript equivalent of PHP’s strip_tags 
// from http://phpjs.org/functions/strip_tags/ 
function strip_tags(input, allowed) { 
    allowed = (((allowed || '') + '') 
    .toLowerCase() 
    .match(/<[a-z][a-z0-9]*>/g) || []) 
    .join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>) 
    var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, 
    commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; 
    return input.replace(commentsAndPhpTags, '') 
    .replace(tags, function($0, $1) { 
     return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : ''; 
    }); 
} 
(私がそれを期待したときに手動で起動しないと機能しません)

特定の範囲のみをExcelファイルとしてエクスポートする方法に関する情報が見つかりませんでした(手順2 )私はいくつかの成功と異なるアプローチを試みたが、別の問題に遭遇した。

最初のスプレッドシートと同じヘッダーを持つ2番目のスプレッドシートを作成しました。最初のスプレッドシートでは、私はこの新しいスプレッドシートに新しい行をコピーするには、次のコードを使用します。新しいスプレッドシートで

function initializeTrigger() 
    var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("myFunction") 
    .forSpreadsheet(sheet) 
    .onChange() 
    .create(); 
} 
function myFunction(e){ 
    Logger.log(e.changeType); 
    if(e.changeType=='INSERT_ROW'){ 
    var ss = SpreadsheetApp.openById('ID'); 
    var ssd = SpreadsheetApp.openById('ID'); 
    var sourceSheet = ss.getSheetByName('Responses'); 
    var lastrow = sourceSheet.getLastRow(); 
    var sourceData = sourceSheet.getRange(lastrow, 1, 1, 53).getValues(); 
ssd.appendRow(sourceData[0]); 
} 
} 

、二つ目は、私はこの記事の冒頭で見た元のコードを試してみましたが、そうではありませんワーキング。私は、ここでの問題は、行を追加してエクスポートしてから行を削除するという事実かもしれないと思うので、次回に新しい行がログにコピーされても、新しい行に関して新しいものは見られないでしょうか?

ここでもin this gistというコードを試してみましたが、手動で実行すると動作しますが、新しい行がコピーされるとすぐに動作するトリガーはわかりません。

+0

有効な質問をするには、あなたの試行を見せてください。今のところあなたはコーディングを試みていないようです。 SpreadsheetAppのドキュメントを見てください。 –

+0

ご意見ありがとうございます。私はいくつかの詳細を追加しました – user2748807

+0

私は4つのステップのうちの3つが今働いています。ステップ2はおそらく最も難しいでしょう... – user2748807

答えて

0

私がしなければならなかったことは、すべてのコードを1つのスクリプトファイルにまとめて一気に起動することだけでした。これを行うには、もっとも効率的なやり方ではないかもしれませんが、私が必要とするものに対してはうまくいきます。 1つの問題は、新しい行が同時に追加されると、Excelファイルの命名と作成に問題があることです。

概要: は、このスクリプトは、 ヘッダ

  • と第二スプレッドシートに1枚のスプレッドシートから、次の

    1. 移動し、新しい行を行います第二のスプレッドシートに基づいてExcelファイルを作成します
    2. 移動ファイルを特定のフォルダに変換する
    3. 次の新しい行を予期して、2番目のスプレッドシートで作成された行を削除します。

    手動でinitializeTriggerを実行します。トリガーは「変更時」に設定する必要があります。

    function initializeTrigger(){ // run this only once to create a trigger if necessary 
        var sheet = SpreadsheetApp.getActive(); 
        ScriptApp.newTrigger("myFunction") 
        .forSpreadsheet(sheet) 
        .onChange() 
        .create(); 
    } 
    
    function myFunction(e){ 
        Logger.log(e.changeType); 
        if(e.changeType=='INSERT_ROW'){ // do Something 
    
        var ss = SpreadsheetApp.openById('Spreadsheet ID'); //Project database and source data sheet #1 
        var ssd = SpreadsheetApp.openById('Spreadsheet ID'); //Spreadsheet to be converted into excel document 
        var sourceSheet = ss.getSheetByName('Responses'); 
        var lastrow = sourceSheet.getLastRow(); 
        var sourceData = sourceSheet.getRange(lastrow, 1, 1, 113).getValues(); 
        ssd.appendRow(sourceData[0]); 
        var fileId = SpreadsheetApp.openById("Spreadsheet ID").getId(); //Spreadsheet to be converted into excel document 
        downloadXLS(fileId); 
        var files = DriveApp.getRootFolder().getFiles(); 
        while (files.hasNext()) { 
        var file = files.next(); 
        var destination = DriveApp.getFolderById("Folder ID"); // Folder where exported excel files are moved too 
        destination.addFile(file); 
        var pull = DriveApp.getRootFolder(); 
        pull.removeFile(file); 
        ssd.deleteRow(2) 
    } 
    } 
    
    /** 
    * Downloads spreadsheet with given file id as an Excel file. 
    * Uses Advanced Drive Service, which must be enabled. 
    * Throws if error encountered. 
    * 
    * From http://stackoverflow.com/a/27281729/1677912 
    * 
    * @param {String} fileId  File ID of Sheets file on Drive. 
    */ 
    function downloadXLS(fileId) { 
        var file = Drive.Files.get(fileId); 
        var url = file.exportLinks[MimeType.MICROSOFT_EXCEL]; 
    
    var options = { 
        headers: { 
        Authorization:"Bearer "+ScriptApp.getOAuthToken() 
        }, 
        muteHttpExceptions : true  /// Get failure results 
        } 
    
        var response = UrlFetchApp.fetch(url, options); 
        var status = response.getResponseCode(); 
        var result = response.getContentText(); 
        if (status != 200) { 
        // Get additional error message info, depending on format 
        if (result.toUpperCase().indexOf("<HTML") !== -1) { 
         var message = strip_tags(result); 
        } 
        else if (result.indexOf('errors') != -1) { 
         message = JSON.parse(result).error.message; 
        } 
        throw new Error('Error (' + status + ") " + message); 
        } 
    
        var ss = SpreadsheetApp.openById('Spreadsheet ID'); 
        var sh = ss.getSheets()[0];// access first sheet (0 indexed) 
        var row = sh.getLastRow(); 
        var data = sh.getRange(row, 2).getValue(); 
        var row2 = sh.getLastRow(); 
        var data2 = sh.getRange(row, 15).getValue(); 
        var doc = response.getBlob(); 
        DriveApp.createFile(doc).setName(data + "-" + data2 + '.xlsx').setDescription(data + "-" + data2); 
    } 
    
    
    // A JavaScript equivalent of PHP’s strip_tags 
    // from http://phpjs.org/functions/strip_tags/ 
    function strip_tags(input, allowed) { 
        allowed = (((allowed || '') + '') 
        .toLowerCase() 
        .match(/<[a-z][a-z0-9]*>/g) || []) 
        .join(''); // making sure the allowed arg is a string containing only tags in lowercase (<a><b><c>) 
        var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, 
        commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; 
        return input.replace(commentsAndPhpTags, '') 
        .replace(tags, function($0, $1) { 
         return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : ''; 
        }); 
    } 
    } 
    
  • 関連する問題