Вставить строку перед строкой в ​​Google листе - PullRequest
0 голосов
/ 04 мая 2018

У меня есть лист Google с большим количеством строк. Для лучшего обзора листа я хочу добавить пустую строку перед каждой строкой, в которой есть данные в ячейке A.

Полагаю, мне нужно использовать insertRowsBefore.

function Insert() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  s.insertRowsBefore(2, 1); // add 1 row before the 2nd
}

Конечно, эта функция работает только для 2-й строки, я не нахожу хорошего решения, чтобы сделать это для каждой строки данных в A.

У кого-нибудь есть решение или советы, чтобы помочь мне?

: 3

1 Ответ

0 голосов
/ 05 мая 2018

Из вашего вопроса и комментария я понял, что для [["value1"], ["value2"], ["value3"]] вы хотите вставить пустые строки, такие как [["value1"], [""], ["value2"], [""], ["value3"]], и каждая пустая строка - это столбец A до последнего столбца. Если мое понимание верно, как насчет этой модификации?

Очки модификации:

  • Я думаю, что вы можете вставить строки, используя insertRowsBefore() цикл for в качестве сценария. Но в этом случае, когда это большое количество строк, скорость процесса будет немного медленной. Поэтому я хотел бы предложить использовать Sheets API. Таким образом, вы можете достичь этого с помощью одного вызова API.

При использовании этого измененного сценария, пожалуйста, включите API Sheets в Advanced Services и консоли API следующим образом.

Включить API Sheets:

Включить Sheets API v4 в расширенных службах Google

  • в редакторе сценариев
    • Ресурсы -> Расширенные услуги Google
    • Включить Google Sheets API v4

Включить Sheets API v4 на консоли API

  • в редакторе скриптов
    • Ресурсы -> Проект облачной платформы
    • Просмотр консоли API
    • На начальном этапе нажмите Включить API и получите учетные данные, например ключи.
    • С левой стороны щелкните Библиотека.
    • В поле Поиск API и сервисов введите «листы». И нажмите Google Sheets API.
    • Нажмите кнопку включения.
    • Если API уже включен, пожалуйста, не выключайте.

Если вы сейчас открываете редактор сценариев со сценарием для использования Sheets API, вы можете включить Sheets API для проекта, перейдя по этому URL-адресу https://console.cloud.google.com/apis/library/sheets.googleapis.com/

Модифицированный скрипт:

function Insert() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var values = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues(); // Retrieve values of column A.
  var sheetId = sheet.getSheetId();
  var requests = [];
  var count = 0;
  var adjustment = 0;
  values.forEach(function(e, i) { // Create requests for batchUpdate.
    if (e[0]) {
      count++;
      requests.push({
        "insertRange": {
          "shiftDimension": "ROWS",
          "range": {
            "sheetId": sheetId,
            "startRowIndex": i + count - adjustment,
            "endRowIndex": i + count + 1 - adjustment
          }
        }
      });
    } else {
      adjustment++;
      requests.pop();
    }
  });
  Sheets.Spreadsheets.batchUpdate({"requests": requests}, spreadsheet.getId()); // Using Sheets API.
}

Ввод:

enter image description here

Вывод:

enter image description here

Примечание:

  • Когда строки не имеют значений для столбца «A», строки пропускаются.
    • Если вы не хотите его пропускать, удалите if (e[0]) { и } else {adjustment++; requests.pop();}.

Рекомендации:

Если я неправильно понял ваш вопрос, извините.

Редактировать 1:

Я изменил способ создания запросов для BatchUpdate. Модифицированный скрипт стал проще благодаря созданию запросов из последней строки. Я думаю, что этим сценарий может удовлетворить желаемый результат.

function Insert() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var values = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
  var sheetId = sheet.getSheetId();
  var offset = 1; // For header
  var requests = [];
  for (var i = values.length - 1; i > offset + 1; i--) {
    if (values[i][0]) {
      requests.push({
        "insertRange": {
          "shiftDimension": "ROWS",
          "range": {
            "sheetId": sheetId,
            "startRowIndex": i,
            "endRowIndex": i + 1
          }
        }
      });
    }
  };
  Sheets.Spreadsheets.batchUpdate({"requests": requests}, spreadsheet.getId());
}

Редактировать 2:

Этот модифицированный скрипт придает цвет добавленной новой пустой строке. Для этого используется repeatCell.

function Insert() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var values = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues();
  var sheetId = sheet.getSheetId();
  var offset = 1; // For header
  var requests = [];
  for (var i = values.length - 1; i > offset + 1; i--) {
    if (values[i][0]) {
      requests.push({
        "insertRange": {
          "shiftDimension": "ROWS",
          "range": {
            "sheetId": sheetId,
            "startRowIndex": i,
            "endRowIndex": i + 1
          }
        }
      });
      requests.push({ // Give color to new blank row.
        "repeatCell": {
          "cell": {
            "userEnteredFormat": {
              "backgroundColor": {
                "red": 1,
                "green": 1,
                "blue": 1,
              }
            }
          },
          "range": {
            "sheetId": sheetId,
            "startRowIndex": i,
            "endRowIndex": i + 1
          },
          "fields": "*"
        }
      });
    }
  };
  Sheets.Spreadsheets.batchUpdate({"requests": requests}, spreadsheet.getId());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...