2016-05-31 16 views
0

Googleスプレッドシートには3種類のシートがあり、それぞれhereと表示されています。Googleスプレッドシートの値を1行から別のシートにコピー

私がしたいことは、「人物」シートの各人ごとに、「食事」の数に基づいて何度も繰り返される人物の行を「stacs」シートに作成することです「食事」シートにあります。だから1人1人当たりpersonA + meal1、1列にpersonA + meal2、2列にpersonA + meal3を作成したい。

これを繰り返す方法を考え出した同じコードを何度も何度も繰り返します。コードは機能しますが、非常に非効率です。私は、同じくらいの繰り返しを、もっときれいで簡単なやり方でやり遂げる方法がなければならないと思います。私はあなたのスプレッドシートを改善するためにいくつかのスクリプトを使用する方法を学んでいるので、これに関する助けは大歓迎です!

いくつかの注意事項:

  • スプレッドシートを見てみるならば、あなたは私が値または範囲のサイズの最後の行を計算するために、いくつかのセルに数式を使用していることがわかります。
  • 「食事」タブで食事の名前の範囲を定義しました。私はこれを非常に誇りに思いません。食事のリストが増えるので、新しい食事を追加するたびに範囲を調整するのではなく、これを扱うよりダイナミックな方法があるのだろうかと思います。

ここではあなたにも、スプレッドシートで見つけたコードです:

function copyValuesA() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheetByName("names"); 
var name = sheet.getRange("A2"); 
var sheetMeals = ss.getSheetByName("meals"); 
var rangeMeals = sheet.getRange("mealsNames"); 
var sheetstacs = ss.getSheetByName("stacs"); 
var lastRow = sheetstacs.getRange("B1").getValue(); 
var mealCount = sheetstacs.getRange("D1").getValue(); 
var lastRowMeals = sheetstacs.getRange("C1").getValue(); 
var rangeOrigname01 = sheetstacs.getRange("A" + lastRow + ":A" + mealCount); 
var rangeOrigname02 = sheetstacs.getRange("A1"); 

name.copyTo(rangeOrigname01); 

var rangeDestMeals01 = sheetstacs.getRange("B" + lastRowMeals); 

rangeMeals.copyTo(rangeDestMeals01); 

} 


function copyValuesB() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheetByName("names"); 
var name = sheet.getRange("A3"); 
var sheetMeals = ss.getSheetByName("meals"); 
var rangeMeals = sheet.getRange("mealsNames"); 
var sheetstacs = ss.getSheetByName("stacs"); 
var lastRow = sheetstacs.getRange("B1").getValue(); 
var mealCount = sheetstacs.getRange("D1").getValue(); 
var lastRowMeals = sheetstacs.getRange("C1").getValue(); 
var rangeOrigname01 = sheetstacs.getRange("A" + lastRow + ":A" + mealCount); 
var rangeOrigname02 = sheetstacs.getRange("A1"); 

name.copyTo(rangeOrigname01); 

var rangeDestMeals01 = sheetstacs.getRange("B" + lastRowMeals); 

rangeMeals.copyTo(rangeDestMeals01); 
} 


function copyValuesC() { 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheetByName("names"); 
var name = sheet.getRange("A4"); 
var sheetMeals = ss.getSheetByName("meals"); 
var rangeMeals = sheet.getRange("mealsNames"); 
var sheetstacs = ss.getSheetByName("stacs"); 
var lastRow = sheetstacs.getRange("B1").getValue(); 
var mealCount = sheetstacs.getRange("D1").getValue(); 
var lastRowMeals = sheetstacs.getRange("C1").getValue(); 
var rangeOrigname01 = sheetstacs.getRange("A" + lastRow + ":A" + mealCount); 
var rangeOrigname02 = sheetstacs.getRange("A1"); 

name.copyTo(rangeOrigname01); 

var rangeDestMeals01 = sheetstacs.getRange("B" + lastRowMeals); 

rangeMeals.copyTo(rangeDestMeals01); 
} 


function copyValuesAll() { 

copyValuesA(); 
copyValuesB(); 
copyValuesC(); 
} 

答えて

0

ダイナミック式では、あなたの興味がこれを達成する場合:あなたのSTACSシートに

を列のセル2プット:

=TRANSPOSE(SPLIT(JOIN(";",ARRAYFORMULA(REPT(A2:A&";",COUNTA(meals!$A$2:$A)))),";")) 

とセルB2の:

これを行う

は自動的にこれらの式は素晴らしいです、新しい値

enter image description here

+0

を占めることになります!彼らは単に問題を非常に簡単に解決するだけです。ありがとうAurielle! –

+0

こんにちはAurielle、それはしばらくして以来、これを読むつもりかどうかは分かりません。私はあなたの解決策がこの間ずっとうまくいっていると言わなければならない。問題は私のスプレッドシートが巨大になり、今週は数式でこのエラーが発生したことです。エラー REPTのテキスト結果が32000文字の制限を超えています。また、Googleスプレッドシートは非常に重く、計算に多くの時間がかかります。私はこのスプレッドシートをExcelファイルに移行することを考えています。この同じ結果を得るために使用できる式がExcelであることが分かっていれば嬉しいです。前もって感謝します! –

関連する問題