2017-08-04 5 views
0

SHEET: https://docs.google.com/spreadsheets/d/1P7thpFW0XixHrUBIp_y6VEqoQqZ-IF_zRffguX6n87M/edit?usp=sharingストレイデータ - ここでの例のシート使用可能

Iは、2つの元のシートの間で共有されるテキストを使用して、第3のシート上に二枚のシートをマージしようとしています。このコードのほとんどは、このWebサイトなどの例から盗んだものです。私の「バグ」はそれが繰り返しテキストとマージされたシートの最後の行を作成しているところ確認してくださいここで

setnote sheet data: 
NAME setnote 
name1 setnote1 
name2 setnote2 

takenote sheet data: 
NAME takenote 
name1 takenote1 
name2 takenote2 

MERGE sheet data: 
NAME setnote takenote 
name1 setnote1 takenote1 
name2 setnote2 takenote2  
     setnote1  <---- this is the stray data when script is run 

コードがある(ただし、データの完全な行):

var ss=SpreadsheetApp.getActiveSpreadsheet(); 

function onOpen() { 
    var menuEntries = [ {name: "Merge Set Notes and Take List", 
     functionName: "mergeDatav01"}, ]; 
    ss.addMenu("Merge Functions",menuEntries); 
} 


function mergeDatav01(){ 

var mergeSheet = ss.getSheetByName('MERGE');      
var setNoteSheet = ss.getSheetByName('setnote'); 
var takeNoteSheet = ss.getSheetByName('takenote'); 

var setFileNameRange = setNoteSheet.getRange(2, 1, setNoteSheet.getLastRow(), setNoteSheet.getLastColumn()).getValues(); 
var takeFileNameRange = takeNoteSheet.getRange(2, 1, takeNoteSheet.getLastRow(), takeNoteSheet.getLastColumn()).getValues();      

var mergeStartRow = 2; 

for (var takeLoop = 0; takeLoop < takeFileNameRange.length; takeLoop++) { 
    for (var setLoop = 0; setLoop < setFileNameRange.length; setLoop++) { 
     if (takeFileNameRange[takeLoop][0] == setFileNameRange[setLoop][0].toString().match(takeFileNameRange[takeLoop][0])) { 
     var row = mergeStartRow + takeLoop 
     mergeSheet.getRange(row, 1, 1).setValue(takeFileNameRange[takeLoop][0]); 
     mergeSheet.getRange(row, 2, 1).setValue(setFileNameRange[setLoop][1]); 
     mergeSheet.getRange(row, 3, 1).setValue(takeFileNameRange[takeLoop][1]);           
     break; 
     break; 
     } 
    } 
    } 
} 

答えて

2

あなたのコードを少し修正しました。私はあなたがマッチ機能を必要としているとは思わない。あなたのデータをコピーし、ページ名をset、tak、mergeに変更しました。変数の名前の一部を変更し、getDataRange()を使用しました。これは、使用が簡単で、型を少なくするためです。

function mergeDatav01() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var mergeSht=ss.getSheetByName('merge');      
    var setSht=ss.getSheetByName('set'); 
    var takSht=ss.getSheetByName('tak'); 
    var setVals=setSht.getDataRange().getValues(); 
    var takVals=takSht.getDataRange().getValues();      
    var mergeStartRow=2; 
    for (var i=1;i<takVals.length;i++) 
    { 
    for (var j=1;j<setVals.length;j++) 
    { 
     if (takVals[i][0]==setVals[j][0]) 
     { 
     var row=[]; 
     row.push(takVals[i][0],setVals[j][1],takVals[i][1]); 
     mergeSht.appendRow(row); 
     } 
    } 
    } 
} 

このコードを実行した後のマージシートの外観は次のとおりです。マージA2で

enter image description here

0

は、Google Appsスクリプトを台無しにしたくなかった場合はここで...

式にそれを行うための定型方法だ

=Filter(setnote!A2:A,setnote!A2:A<>"") 

式併合B2

=ARRAYFORMULA(IF(A2:A<>"",VLOOKUP(A2:A,setnote!A:B,match("setnote",setnote!$1:$1,0),FALSE),"")) 
マージC2におけるは

=ARRAYFORMULA(IF(A2:A<>"",VLOOKUP(A2:A,takenote!A:B,match("takenote",takenote!$1:$1,0),FALSE),"")) 

OR ...あなたはそれをすべてを組み合わせて、マージA2でこれを置くことができ、私があればそれらのいずれかを説明するのに満足している

={Filter(setnote!A2:A,setnote!A2:A<>""),ARRAYFORMULA(IF(Filter(setnote!A2:A,setnote!A2:A<>"")<>"",VLOOKUP(Filter(setnote!A2:A,setnote!A2:A<>""),setnote!A:B,match("setnote",setnote!$1:$1,0),FALSE),"")),ARRAYFORMULA(IF(Filter(setnote!A2:A,setnote!A2:A<>"")<>"",VLOOKUP(Filter(setnote!A2:A,setnote!A2:A<>""),takenote!A:B,match("takenote",takenote!$1:$1,0),FALSE),""))} 

あなたが必要です。

関連する問題