Google表格脚本(JavaScript)的多个问题

时间:2018-12-06 17:42:47

标签: arrays google-apps-script google-sheets

需要说的针,我对此很陌生,但我会尽力找出所有这些。我现在有一个脚本,该脚本可以主动从整个工作簿中删除所有空行。但我希望有人可以协助将其缩小到该工作簿中的单个表格。

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);

}

Score Card Screenshot

在一个完美的世界中,我想要进行的设置如下。上面是我们正在使用的记分卡的屏幕截图。我想将当前日期(A1)复制到“比赛结果”表,然后将最终成绩和团队名称(A32:E36)复制并移动到其下方的“比赛结果”表中。一旦完成,我想删除结果之间的空行,因为到目前为止,这就是复制时的样子。 (请参见下图)

Race Results Screenshot

在此先感谢任何能够以任何形式或形式为您提供帮助的人。

修改: 从电子表格中删除空行的功能正常。即使在给它们不同的名称时,在同一操作中多次复制仍然存在问题。这是我更新的脚本。

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();
}

1 个答案:

答案 0 :(得分:0)

删除工作表上的所有空白行

function delBlankRows(shtname){
  var shtname=shtname || 'Sheet1';
  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 Copy() {
  var sss = SpreadsheetApp.getActive();
  var ss1 = sss.getSheetByName('Score Card');
  var range1 = ss1.getRange('A1');//This range is only one cell
  var data1 = range1.getValues();
  var ts1 = sss.getSheetByName('Race Results');  
  ts1.getRange(ts1.getLastRow()+1, 1, data1.length, data1[0].length).setValues(data1);
  var ss2 = sss.getSheetByName('Score Card');
  var range2 = ss2.getRange('A32:E36');
  var data2 = range2.getValues();
  var ts2 = sss.getSheetByName('Race Results');  
  ts2.getRange(ts2.getLastRow()+1, 1, data2.length, data2[0].length).setValues(data2);
}