如何不将空白列传输到 Master Sheet?
How to Not Transfer Blank Column to Master Sheet?
在添加 'if' 之前,此代码可以完美运行。 'if' 应该防止第 2 列中没有数据的行被传输到主 sheet。如何让没有数据的数据无法传输。
function combineSheets() {
var sApp = SpreadsheetApp.getActiveSpreadsheet();
var s1= sApp.getSheetByName("January");
var s2= sApp.getSheetByName("February");
var s3= sApp.getSheetByName("March");
var s4= sApp.getSheetByName("April");
var s5= sApp.getSheetByName("May");
var s6= sApp.getSheetByName("June");
var s7= sApp.getSheetByName("July");
var s8= sApp.getSheetByName("August");
var s9= sApp.getSheetByName("September");
var s10= sApp.getSheetByName("October");
var s11= sApp.getSheetByName("November");
var s12= sApp.getSheetByName("December");
var s13= sApp.getSheetByName("Master");
var s1values = s1.getRange(1,2,s1.getLastRow(),27).getValues();
var s2values = s2.getRange(1,2,s2.getLastRow(),27).getValues();
var s3values = s3.getRange(1,2,s3.getLastRow(),27).getValues();
var s4values = s4.getRange(1,2,s4.getLastRow(),27).getValues();
var s5values = s5.getRange(1,2,s5.getLastRow(),27).getValues();
var s6values = s6.getRange(1,2,s6.getLastRow(),27).getValues();
var s7values = s7.getRange(1,2,s7.getLastRow(),27).getValues();
var s8values = s8.getRange(1,2,s8.getLastRow(),27).getValues();
var s9values = s9.getRange(1,2,s9.getLastRow(),27).getValues();
var s10values = s10.getRange(1,2,s10.getLastRow(),27).getValues();
var s11values = s11.getRange(1,2,s11.getLastRow(),27).getValues();
var s12values = s12.getRange(1,2,s12.getLastRow(),27).getValues();
var sourceData = s1values.concat(s2values,s3values,s4values,s5values,s6values,s7values,s8values,s9values,s10values,s11values,s12values);
for (var i in sourceData) {
if (sourceData[i][1] !== null && sourceData[i][1] !== '') {
targetData.push(sourceData[i]);
}
var s13values = [];
s13values = s1values.concat(s2values,s3values,s4values,s5values,s6values,s7values,s8values,s9values,s10values,s11values,s12values);
s13.getRange(1,1,s13values.length,27).setValues(s13values);
}
解释:
我相信您的目标是将每月 sheet 的数据传输到 Master
sheet,但 B
列为空的行除外。
迭代 sheets 和 forEach sheet 从第二列获取数据,直到第 27
列,直到最后一行对应sheet.
的内容
Filter 列 B
为空的行。请记住,您的范围从 B
列开始,因此就 JavaScript 而言,值数组的 zero
元素对应于列 B
:
的值
sh.getRange(1,2,sh.getLastRow(),27).getValues().filter(r=>r[0]!='');
Spread syntax 用于确保正确连接值。
我还改进了你的代码,不仅在性能方面,而且更容易修改它,例如更改一些范围参数等。
解决方案:
function combineSheets() {
const sApp = SpreadsheetApp.getActiveSpreadsheet();
const months = ['January','February','March','April','May','June','July',
'August','September','October','November','December'];
const master = sApp.getSheetByName('Master');
const sourceData = [];
months.forEach(m=>{
let sh = sApp.getSheetByName(m);
let vals = sh.getRange(1,2,sh.getLastRow(),27).getValues().filter(r=>r[0]!='');
sourceData.push(...vals);
});
master.getRange(1,1,sourceData.length,sourceData[0].length).setValues(sourceData);
}
在添加 'if' 之前,此代码可以完美运行。 'if' 应该防止第 2 列中没有数据的行被传输到主 sheet。如何让没有数据的数据无法传输。
function combineSheets() {
var sApp = SpreadsheetApp.getActiveSpreadsheet();
var s1= sApp.getSheetByName("January");
var s2= sApp.getSheetByName("February");
var s3= sApp.getSheetByName("March");
var s4= sApp.getSheetByName("April");
var s5= sApp.getSheetByName("May");
var s6= sApp.getSheetByName("June");
var s7= sApp.getSheetByName("July");
var s8= sApp.getSheetByName("August");
var s9= sApp.getSheetByName("September");
var s10= sApp.getSheetByName("October");
var s11= sApp.getSheetByName("November");
var s12= sApp.getSheetByName("December");
var s13= sApp.getSheetByName("Master");
var s1values = s1.getRange(1,2,s1.getLastRow(),27).getValues();
var s2values = s2.getRange(1,2,s2.getLastRow(),27).getValues();
var s3values = s3.getRange(1,2,s3.getLastRow(),27).getValues();
var s4values = s4.getRange(1,2,s4.getLastRow(),27).getValues();
var s5values = s5.getRange(1,2,s5.getLastRow(),27).getValues();
var s6values = s6.getRange(1,2,s6.getLastRow(),27).getValues();
var s7values = s7.getRange(1,2,s7.getLastRow(),27).getValues();
var s8values = s8.getRange(1,2,s8.getLastRow(),27).getValues();
var s9values = s9.getRange(1,2,s9.getLastRow(),27).getValues();
var s10values = s10.getRange(1,2,s10.getLastRow(),27).getValues();
var s11values = s11.getRange(1,2,s11.getLastRow(),27).getValues();
var s12values = s12.getRange(1,2,s12.getLastRow(),27).getValues();
var sourceData = s1values.concat(s2values,s3values,s4values,s5values,s6values,s7values,s8values,s9values,s10values,s11values,s12values);
for (var i in sourceData) {
if (sourceData[i][1] !== null && sourceData[i][1] !== '') {
targetData.push(sourceData[i]);
}
var s13values = [];
s13values = s1values.concat(s2values,s3values,s4values,s5values,s6values,s7values,s8values,s9values,s10values,s11values,s12values);
s13.getRange(1,1,s13values.length,27).setValues(s13values);
}
解释:
我相信您的目标是将每月 sheet 的数据传输到 Master
sheet,但 B
列为空的行除外。
迭代 sheets 和 forEach sheet 从第二列获取数据,直到第
的内容27
列,直到最后一行对应sheet.Filter 列
的值B
为空的行。请记住,您的范围从B
列开始,因此就 JavaScript 而言,值数组的zero
元素对应于列B
:sh.getRange(1,2,sh.getLastRow(),27).getValues().filter(r=>r[0]!='');
Spread syntax 用于确保正确连接值。
我还改进了你的代码,不仅在性能方面,而且更容易修改它,例如更改一些范围参数等。
解决方案:
function combineSheets() {
const sApp = SpreadsheetApp.getActiveSpreadsheet();
const months = ['January','February','March','April','May','June','July',
'August','September','October','November','December'];
const master = sApp.getSheetByName('Master');
const sourceData = [];
months.forEach(m=>{
let sh = sApp.getSheetByName(m);
let vals = sh.getRange(1,2,sh.getLastRow(),27).getValues().filter(r=>r[0]!='');
sourceData.push(...vals);
});
master.getRange(1,1,sourceData.length,sourceData[0].length).setValues(sourceData);
}