0

約20列から100行までのサマリーテーブルがありますが、これをフラットリストに変換してデータベースにインポートできます。Googleスプレッドのピボット - マルチパイプヘッダーの列と行

This solutionは私のケースでは正しく機能していません。私の知識はJSを適切に調整する能力のはるか下です。

は3つのExample sheetのタブがあります: - 私は現在

  • 望ましい結果を持っているもののダミーデータ -

    1. ソースデータを、私は私が得るもの
    2. にソースデータを変換したいのか - 上記のthe solutionを使用すると結果が得られます

    シートが共有されているので、スクリプトを試してみることができます(メニュー>スクリプト>実行)。自動的に新しいタブが作成されます。

  • +0

    HIルーベン。あなたは正しい、私の質問は十分にはっきりしていなかった。私はそれを更新しました。希望は今より良いです –

    答えて

    1

    ここで私はJS学習とグーグルーグの後に思いついたことがあります。もし誰かがそれを短くする/クリーナー/シンプルにする方法を提案できれば - 私はすべて耳です。完璧とはほど遠いかもしれませんが、まさに私が必要とするものです。

    function transpose(){ 
        var source = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SOURCE DATA'); 
        var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    
        var numColumns = source.getLastColumn(); 
        var numRows = source.getLastRow(); 
        Logger.log('numColumns = ' +numColumns); 
        Logger.log('numRows = ' +numRows); 
    
    
        //GET NUMBER OF HEADERS (PRODUCTS) 
    
        var products = []; // get product models in the first row 
        for (var b = 2; b <= numColumns; b++){ 
        if (source.getRange(1, b).getValue() != "") { 
         products.push([source.getRange(1, b).getValue()]); //store 
        } 
        } 
    
    
        // PRODUCTS and SITES INTO COLUMNS 
    
        var output = []; 
    
        var sites = []; // get sites list 
        for (var a = 3; a <= numRows; a++){ 
        if (source.getRange(a, 1).getValue() != "") { 
         sites.push([source.getRange(a, 1).getValue()]); //store 
        } 
        } 
    
        for(var p in products){ 
        for(var s in sites){ 
         var row = []; 
         row.push(sites[s]); 
         row.push(products[p]); 
         output.push(row);//collect data in separate rows in output array 
        } 
        } 
    
        var date = Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "M/d/yyyy"); 
        Logger.log('Date = ' +date) 
        ss.insertSheet(date,0).getRange(1,1,output.length,output[0].length).setValues(output); 
    
        var newSheet = ss.getSheetByName(date); 
    
    
        // COPY REGIONS 
    
        var numProducts = products.length; // number of models 
        Logger.log('numProducts = ' +numProducts); 
    
        var i = 1; 
        var j = 3 // first column number to copy 
        do { 
        var colC = newSheet.getRange("C1:C").getValues(); 
        var copyToCell = colC.filter(String).length+1; 
        Logger.log('copyTo R = ' +copyToCell); 
    
        source.getRange(3,2,numRows-2,1).copyTo(newSheet.getRange(copyToCell,3), {contentsOnly:true}); 
        i++; 
    
        source.getRange(3,j,numRows-2,2).copyTo(newSheet.getRange(copyToCell,4), {contentsOnly:true}); 
        j+=2; 
        } 
        while (i <= numProducts); 
        while (j < numColumns); 
    
    
        // SORT BY SITE AND PRODUCT 
    
        newSheet.getDataRange().sort([1, 2]); 
    } 
    
    0

    私はあなたが場所や地域からの一意の行のキーを取得し、余分なスクリプトを必要としないmy answer hereからのメソッドを使用するようにCONCATを使用することができると思います。

    キー連結(例:CONCAT(A3, "~", A4))を使用すると、元の場所と地域をピボットテーブルに抽出することもできます(REGEXEXTRACT(A1, "(\w+)~")REGEXEXTRACT(A1, "~(\w+)")など)。

    1

    私はこの簡単な一般的なカスタム機能を、Google Spreadsheetのピリオド/リバースピボットに書いています。 注:これは他のビルトインスプレッドシート関数のようなカスタム関数なので、実行する必要はありません。unique()や他の配列関数のように使用できます。あなたのケースでは

    それは次のコードを使用して同じように簡単になります。=unpivot(A1:H6,2,2,"product","MIN","MAX")

    あなたはここに例を見つけることができます:https://docs.google.com/spreadsheets/d/12TBoX2UI_Yu2MA2ZN3p9f-cZsySE4et1slwpgjZbSzw/edit#gid=422214765

    をそして、これはコードです:

    /** 
    * Unpivot a pivot table of any size. 
    * 
    * @param {A1:D30} data The pivot table. 
    * @param {1} fixColumns Number of columns, after which pivoted values begin. Default 1. 
    * @param {1} fixRows Number of rows (1 or 2), after which pivoted values begin. Default 1. 
    * @param {"city"} titlePivot The title of horizontal pivot values. Default "column". 
    * @param {"distance"[,...]} titleValue The title of pivot table values. Default "value". 
    * @return The unpivoted table 
    * @customfunction 
    */ 
    function unpivot(data,fixColumns,fixRows,titlePivot,titleValue) { 
        var fixColumns = fixColumns || 1; // how many columns are fixed 
        var fixRows = fixRows || 1; // how many rows are fixed 
        var titlePivot = titlePivot || 'column'; 
        var titleValue = titleValue || 'value'; 
        var ret=[],i,j,row,uniqueCols=1; 
    
        // we handle only 2 dimension arrays 
        if (!Array.isArray(data) || data.length < fixRows || !Array.isArray(data[0]) || data[0].length < fixColumns) 
        throw new Error('no data'); 
        // we handle max 2 fixed rows 
        if (fixRows > 2) 
        throw new Error('max 2 fixed rows are allowed'); 
    
        // fill empty cells in the first row with value set last in previous columns (for 2 fixed rows) 
        var tmp = ''; 
        for (j=0;j<data[0].length;j++) 
        if (data[0][j] != '') 
         tmp = data[0][j]; 
        else 
         data[0][j] = tmp; 
    
        // for 2 fixed rows calculate unique column number 
        if (fixRows == 2) 
        { 
        uniqueCols = 0; 
        tmp = {}; 
        for (j=fixColumns;j<data[1].length;j++) 
         if (typeof tmp[ data[1][j] ] == 'undefined') 
         { 
         tmp[ data[1][j] ] = 1; 
         uniqueCols++; 
         } 
        } 
    
        // return first row: fix column titles + pivoted values column title + values column title(s) 
        row = []; 
        for (j=0;j<fixColumns;j++) row.push(fixRows == 2 ? data[0][j]||data[1][j] : data[0][j]); // for 2 fixed rows we try to find the title in row 1 and row 2 
        for (j=3;j<arguments.length;j++) row.push(arguments[j]); 
        ret.push(row); 
    
        // processing rows (skipping the fixed columns, then dedicating a new row for each pivoted value) 
        for (i=fixRows;i<data.length && data[i].length > 0 && data[i][0];i++) 
        { 
        row = []; 
        for (j=0;j<fixColumns && j<data[i].length;j++) 
         row.push(data[i][j]); 
        for (j=fixColumns;j<data[i].length;j+=uniqueCols) 
         ret.push( 
         row.concat([data[0][j]]) // the first row title value 
         .concat(data[i].slice(j,j+uniqueCols)) // pivoted values 
        ); 
        } 
    
        return ret; 
    } 
    
    関連する問題