Многочисленные проблемы со скриптами Google Sheets (JavaScript) - PullRequest
0 голосов
/ 06 декабря 2018

ИГРОКИ, ЧТОБЫ СКАЗАТЬ, я очень новичок в этом, но изо всех сил пытаюсь понять все это.У меня сейчас есть скрипт, который активно удаляет все пустые строки из всей книги.Но я надеюсь, что кто-то может помочь, сузив это до одного листа в этой книге.

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

}

Снимок экрана карты показателей

В идеальном мире япопытка получить настройки заключается в следующем.Выше приведен скриншот используемой нами системы показателей.Я хочу скопировать текущую дату (А1) на лист «Результаты гонок», а затем скопировать окончательный счет с именами команд (А32: Е36) и переместить их на лист «Результаты гонок» прямо под ним.Как только это будет сделано, я хочу удалить пустые строки между результатами, потому что на данный момент это выглядит так, как при копировании.(см. изображение ниже)

Снимок экрана результатов гонки

Заранее спасибо всем, кто может помочь с любым из этого в любой форме или форме.

Редактировать: удаление пустых строк из электронной таблицы работает как задумано.По-прежнему возникают проблемы с копированием несколько раз в одном действии, даже если им присвоены разные имена.Вот мой обновленный скрипт.

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 голосов
/ 09 декабря 2018

Удаление всех пустых строк на листе

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...