2016-05-31 200 views
0

我有一張帶有3張不同表格的Google電子表格,您可以看到hereGoogle電子表格將數據從一行復制到另一個表格

我想要做的是按照'人'表中的每個人,在'stacs'表中創建一行人,根據「餐」的數量重複多次在「餐」表中。所以,每個人,我想創建第1行的personA + meal1,第2行的personA + meal2,第3行的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:

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

這樣做會自動考慮新的價值觀

enter image description here

+0

這些公式是真棒!他們很容易解決問題。非常感謝Aurielle! –

+0

嗨Aurielle,我不確定你是否會閱讀這篇文章,因爲它已經有一段時間了。我不得不說,你的解決方案在這段時間裏一直在做着驚人的工作。問題是我的電子表格變得很龐大,本週我在公式中得到了這個錯誤:錯誤 REPT的文本結果比32000個字符的限制更長。此外,Google Spreadsheet現在非常沉重,需要花費大量時間進行計算。我正在考慮將此電子表格遷移到Excel文件中,如果您知道任何可用於獲取相同結果的公式,我都會想到Excel。提前致謝! –

相關問題