【问题标题】:Multiple Issues with Google Sheets Scripts (JavaScript)Google 表格脚本 (JavaScript) 的多个问题
【发布时间】: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);

}

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

【问题讨论】:

  • 对第一个函数进行一些重构 - 创建一个接收工作表作为输入并修剪其行的方法,例如function removeRowsFromSheet(sheet)。 (这个代码基本上已经写好了)。然后你在上面的代码和你想使用的代码中都使用这个函数。至于您的复制脚本,它们具有相同的名称。这意味着最后写入的那个替换了该名称的先前定义 - 执行代码中只存在一个。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢@Cooper!它有很大帮助。我仍然遇到了复制脚本的问题(它看起来与我发布它时基本相同)。但我总是可以让第一个副本正常工作,但我不能让第二个副本正常工作,它总是粘贴空白单元格关于如何一个接一个地获取多个单元格副本的任何想法?如果我自己运行一个,那很好,如果我自己运行另一个,它也可以。只有当我尝试连续运行它们时,它们才会出现问题。
  • 你是说 CopyDate() 有效而 CopyScore() 无效?
  • 当单独运行时,它们都可以工作。如果我使用上面编辑的以下函数(OP),只有 CopyDate 似乎实际上正确复制和粘贴,CopyScore 没有。但是,单独从脚本页面运行时,它们都可以正常工作。我为您将整个脚本复制到原始帖子中,并在底部运行“SaveRaceResults”函数以按顺序触发所有内容。
  • 我把它们放在同一个函数中并更新了我的答案,它对我来说很好。
  • 太好了,我没想过将两者结合在一起,因为我认为如果它们在同一个函数中,它们会相互覆盖。再次感谢您的帮助,一切似乎都运行良好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多