2016-05-31 203 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。提前致谢! –

相关问题