【问题标题】:Google App Script add row at every "N"-th rowGoogle App Script 在每“N”行添加一行
【发布时间】:2022-01-12 02:18:16
【问题描述】:

我想在每 03 行之前添加 2 行,如 A 列中所述。所以我编写了如下代码来循环并添加行。

for( var i = 3; i <= row; i = i + 5 ) {
    sheet.insertRowAfter( i + count );
    count = count + 2;   
}

原始数据示例:

预期结果:

现在的问题: google sheet 总数据:18652 行,执行时间比我预期的要长。有没有什么方法/方法可以提高执行速度?

错误:

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法理解I wanted to add 2row before every 03 Row as stated in column A. 和您的示例图像之间的关系。我可以问你目标的细节吗?
  • 嗨,先生们,对不起,我解释得很好。我添加了想要的预期结果
  • 感谢您回复并添加更多信息。根据您的附加信息,我提出了一个答案。你能确认一下吗?如果我误解了您的问题并且没有用处,我深表歉意。

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


【解决方案1】:

我相信你的目标如下。

  • 您想实现问题中显示的图像。
  • 您希望降低脚本的处理成本。

在这种情况下,使用 Sheets API 怎么样?我认为当您的情况使用 Sheets API 时,流程成本将能够减少一点。当您的脚本使用 Sheets API 时,它变为如下。

示例脚本:

在使用此脚本之前,please enable Sheets API at Advanced Google services。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  const sheet = ss.getSheetByName("Sheet1"); // Please set the sheet name

  const sheetId = sheet.getSheetId();
  const lastRow = sheet.getLastRow();
  const requests = [];
  for (var i = 3; i <= lastRow; i += 5) {
    requests.push({ insertDimension: { range: { sheetId, dimension: "ROWS", startIndex: i, endIndex: i + 2 } } });
  }
  requests.reverse();
  Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}

参考资料:

补充:

关于V8 runtime is enable, still it doesn't work.,当我看到你当前的脚本时,你的脚本如下。

function myFunction() {

  const ss = SpreadsheetApp.openById("1zsnqh6kNbeOJiDTh5olFj432Hkx5OPkynI1NGAO8pBk");
  const sheet = ss.getSheetByName("Forecast1");
  
 
  const lastRow = sheet.getLastRow();
  const requestor = [];
 for (var i = 3; i <= lastRow; i += 5) {
    requestor.push({insertDimension: { range: { sheetId: ss.getId(), dimension: "ROWS", startIndex: 1, endIndex: 1 + 2 } } });
    
  }
  requestor.reverse();
  Sheets.Spreadsheets.batchUpdate({requests:requestor},  ss.getId());

}
  1. 很遗憾,我可以确认您没有正确反映我提议的脚本。

  2. 此脚本与示例图片中显示的脚本不同。

  3. 我已经在my comment提到了这个问题。

    根据您的错误消息,我认为您可能没有正确反映我提议的脚本。因为在你的错误中,当使用Spreadsheet ID作为sheet ID时,就会出现这样的错误。

  4. 我在循环中提出了requests.push({ insertDimension: { range: { sheetId, dimension: "ROWS", startIndex: i, endIndex: i + 2 } } });。但是您已修改为requestor.push({ insertDimension: { range: { sheetId: sheet.getSheetId(), dimension: "ROWS", startIndex: 1, endIndex: 1 + 2 } } });。这没有正确反映我提议的脚本。

修改脚本:

当您使用const ss = SpreadsheetApp.openById("1zsnqh6kNbeOJiDTh5olFj432Hkx5OPkynI1NGAO8pBk") 修改您当前的脚本时,它变为如下。请不要修改来测试这个脚本。

function myFunction() {
  const ss = SpreadsheetApp.openById("1zsnqh6kNbeOJiDTh5olFj432Hkx5OPkynI1NGAO8pBk");

  const sheet = ss.getSheetByName("testing"); // Please set the sheet name

  const sheetId = sheet.getSheetId();
  const lastRow = sheet.getLastRow();
  const requests = [];
  for (var i = 3; i <= lastRow; i += 5) {
    requests.push({ insertDimension: { range: { sheetId, dimension: "ROWS", startIndex: i, endIndex: i + 2 } } });
  }
  requests.reverse();
  Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}

注意:

  • 您的“Forecast1”表很大(18732 行和 59 列)。所以,首先,为了测试这个脚本,我建议使用你的“测试”样本表并确认脚本是否有效。

  • 当我测试您的“测试”样本表时,没有出现错误。但是,当我测试您的“Forecast1”时,出现了与 Sheets API 内部错误相关的错误。我担心这可能与当前的限制有关(未显示)。从这里,关于大表,例如,当您测试我的“Forecast1”脚本时,会出现同样的问题,我建议拆分表以减小大小。

【讨论】:

  • 你好田池!你的回答对我来说应该是最好的样本。不幸的是,我面临错误“对 sheet.spreadsheets.batchUpdate 的 API 调用失败并出现错误:'requests[0].insert_dimension.range.sheet_id' (TYPE_INT32) 处的值无效,“1zsnqh6kNbeOJiDTh5olFj432Hkx5OPkynI1NGAO8pBk”"
  • @Ah Chuan 谢谢回复。我带来的不便表示歉意。从您的错误消息中,我认为您可能没有正确反映我提出的脚本。因为在您的错误中,当使用电子表格 ID 作为工作表 ID 时,会出现这样的错误。首先,我想推荐使用我的原始脚本进行测试。如果您不能理解这一点,请提供您当前的整个脚本来复制您的问题?通过这个,我想检查一下。
  • 谢谢田池。当我使用您的原始脚本时,我也面临这个问题。我已经在我的帖子中分享了错误消息。如果您能提供帮助,不胜感激。
  • @Ah Chuan 感谢您的回复和补充信息。在这种情况下,我担心您可能不会启用 V8 运行时。因为在不使用 V8 运行时,就会出现这样的错误。请您再确认一下好吗?如果没有使用 V8 运行时,请启用它并重新测试。对于我提出的脚本使用了 V8 运行时,我深表歉意。如果您需要禁用 V8 运行时,请告诉我。
  • V8 运行时已启用,但仍无法正常工作。感谢您是否可以访问我的脚本上的调试。 "docs.google.com/spreadsheets/d/…"
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多