【发布时间】:2018-12-06 17:42:47
【问题描述】:
需要说,我对此很陌生,但尽我所能来弄清楚这一切。我现在有一个脚本,它主动从整个工作簿中删除所有空行。但我希望有人可以帮助将其缩小到该工作簿中的一张纸。
function removeEmptyRows() {
SpreadsheetApp.getActive()
.getSheets()
.forEach(function (s) {
c = 0;
s.getRange(1, 1, s.getMaxRows(), s.getMaxColumns())
.getValues()
.forEach(function (r, j) {
if (r.toString()
.replace(/,/g, "")
.length == 0) {
s.deleteRow((j += 1) - c)
c += 1;
}
})
})
}
理想情况下,我希望在我的名为“赛车结果”的工作簿中只删除一张工作表上的空白行。我需要这个的原因是由于电子表格的设置方式以及多行合并在一起。因此,当我将这些结果复制到不同的工作表时,它们之间存在间隙,我希望将它们删除。这是我用来将数据复制到另一张工作表的脚本。
function Copy() {
var sss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ss = sss.getSheetByName('Score Card');
var range = ss.getRange('A32:E36');
var data = range.getValues();
var tss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ts = tss.getSheetByName('Race Results');
ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data);
}
如果不把最后一个活动扳手扔进这个巨大的混乱中,我一直在尝试在同一个脚本中复制两个不同的单元格范围,我觉得这是不可能的,因为只有后一个被复制,而最初的一个被复制被丢弃。这是我正在使用的另一个复制脚本,它在上面的脚本之前运行。
function Copy() {
var sss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ss = sss.getSheetByName('Score Card');
var range = ss.getRange('A1:A1');
var data = range.getValues();
var tss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ts = tss.getSheetByName('Race Results');
ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data);
}
在一个完美的世界中,我要进行以下设置。上面是我们正在使用的记分卡的屏幕截图。我想将当前日期 (A1) 复制到“比赛结果”表中,然后我想复制带有团队名称 (A32:E36) 的最终分数并将它们移动到其下方的“比赛结果”表中。完成后,我想删除结果之间的空行,因为到目前为止,这是复制时的样子。 (见下图)
提前感谢任何能够以任何形式或形式提供帮助的人。
编辑: 从电子表格中删除空行按预期运行。即使给它们不同的名称,在同一操作中多次复制仍然存在问题。这是我更新的脚本。
function CopyDate() {
var sss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ss = sss.getSheetByName('Score Card');
var range = ss.getRange('A1:A1');//This range is only one cell
var data = range.getValues();
var tss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ts = tss.getSheetByName('Race Results');
ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data);
}
function CopyScore() {
var sss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ss = sss.getSheetByName('Score Card');
var range = ss.getRange('A32:E36');
var data = range.getValues();
var tss = SpreadsheetApp.openById('18cl69Id4saI455wk__-PhvfxXZa7iWlQpoiRKqBz6bU');
var ts = tss.getSheetByName('Race Results');
ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data);
}
function delBlankRows(shtname){
var shtname=shtname || 'Race Results';
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName(shtname);
var rg=sh.getRange(1,1,sh.getMaxRows(),sh.getLastColumn());
var vA=rg.getValues();
var n=0;
for(var i=0;i<vA.length;i++){
if(!vA[i].join("")){
sh.deleteRow(i-n+1);
n++;
}
}
}
function Sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
function SaveRaceResults() {
CopyDate();
Sleep(5000);
CopyScore();
Sleep(5000);
delBlankRows();
}
【问题讨论】:
-
对第一个函数进行一些重构 - 创建一个接收工作表作为输入并修剪其行的方法,例如
function removeRowsFromSheet(sheet)。 (这个代码基本上已经写好了)。然后你在上面的代码和你想使用的代码中都使用这个函数。至于您的复制脚本,它们具有相同的名称。这意味着最后写入的那个替换了该名称的先前定义 - 执行代码中只存在一个。
标签: arrays google-apps-script google-sheets