在Google工作表中的行前插入行

时间:2018-05-04 15:36:27

标签: javascript google-sheets

我有一张包含很多行的google表格。为了更好地查看工作表,我希望在单元格A中有数据的每一行之前添加一个空白行

我想我需要使用insertRowsBefore。

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

当然,这个功能只适用于第二行,我找不到为A中每一行数据做到这一点的好方法。

有人有解决方案或提示来帮助我吗?

:3

1 个答案:

答案 0 :(得分:2)

根据您的问题和评论,我可以理解,对于[["value1"], ["value2"], ["value3"]],您希望插入空白行,例如[["value1"], [""], ["value2"], [""], ["value3"]],每个空行都是A列到最后一列。如果我的理解是正确的,那么这个修改怎么样?

修改要点:

  • 我认为您可以使用insertRowsBefore()通过for循环作为脚本插入行。但在这种情况下,当它是大量行时,处理速度会有点慢。所以我想建议使用Sheets API。通过这种方式,您可以通过一次API调用来实现它。

使用此修改过的脚本时,请按照以下步骤在Advanced Google Services和API控制台中启用Sheets API。

启用表格API:

在高级Google服务中启用表格API v4

  • 在脚本编辑器上
    • 资源 - >高级Google服务
    • 启用Google表格API v4

Enable Sheets API v4 at API console

  • 在脚本编辑器上
    • 资源 - >云平台项目
    • 查看API控制台
    • 在“入门”中,单击“启用API”并获取密钥等凭据。
    • 在左侧,单击“库”。
    • 在搜索API&服务,输入“表”。然后点击Google表格API。
    • 单击“启用”按钮。
    • 如果已启用API,请不要关闭。

如果您现在使用使用Sheets API的脚本打开脚本编辑器,则可以通过访问此URL https://console.cloud.google.com/apis/library/sheets.googleapis.com/

为项目启用Sheets API

修改后的脚本:

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:

此修改后的脚本为添加的新空行提供while颜色。为此,使用了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());
}