首页 > 解决方案 > 循环使用 Google 表格,直到找到空单元格

问题描述

我正在尝试在 Google 表格中运行以下脚本,但无法停止。任何人都可以建议我哪里出错了。谢谢

function TriplicateEachLine() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var cc = ss.getCurrentCell();
  //Set New Hedders
  ss.getRange('R1').setValue('Stock');
  ss.getRange('S1').setValue('Weeks');
  ss.getRange('A2').activate();
  //Start of Loop Function
  while (cc > ""){
    ss.getCurrentCell().offset(0, 17).setFormulaR1C1('=R[0]C[-5]-R[0]C[-4]');
    ss.getCurrentCell().offset(0, 18).setValue('12 Weeks');
    sheet.getRange(ss.getCurrentCell().getRow(), 1, 1, sheet.getMaxColumns()).activate();
    ss.getActiveSheet().insertRowsAfter(ss.getActiveRange().getLastRow(), 1);
    ss.getActiveRange().offset(ss.getActiveRange().getNumRows(), 0, 1, ss.getActiveRange().getNumColumns()).activate();
    sheet.getRange(ss.getCurrentCell().getRow() - 1, 1, 1, sheet.getMaxColumns()).copyTo(ss.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    ss.getCurrentCell().offset(0, 17).setFormulaR1C1('=R[0]C[-5]-R[0]C[-4]');
    ss.getCurrentCell().offset(0, 18).setValue('8 Weeks');
    sheet.getRange(ss.getCurrentCell().getRow(), 1, 1, sheet.getMaxColumns()).activate();
    ss.getActiveSheet().insertRowsAfter(ss.getActiveRange().getLastRow(), 1);
    ss.getActiveRange().offset(ss.getActiveRange().getNumRows(), 0, 1, ss.getActiveRange().getNumColumns()).activate();
    sheet.getRange(ss.getCurrentCell().getRow() - 2, 1, 1, sheet.getMaxColumns()).copyTo(ss.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    ss.getCurrentCell().offset(0, 17).setFormulaR1C1('=R[0]C[-5]-R[0]C[-4]');
    ss.getCurrentCell().offset(0, 18).setValue('4 Weeks');
    ss.getCurrentCell().offset(1, 0).activate();
  }
  Browser.msgBox("Complete!");
};

标签: google-apps-scriptgoogle-sheets

解决方案


有几个问题可能会影响您:

  1. 没有活动的电子表格。
  2. 活动工作表不是您认为的工作表。
  3. 当前单元格不是您认为的那个。
  4. 您正在尝试检查当前单元格的值,但没有得到它的值。
  5. 您检查单元格是否为空的条件是错误的。
  6. 你永远不会改变cc.
  7. Browser.msgBox()正在等待用户输入。

Logger.log()您可以使用语句检查前三个问题。

// Check values
Logger.log("Active Spreadsheet Name: " + ss.getName());
Logger.log("Active Sheet Name: " + sheet.getName());
Logger.log("Cell Address: " + cell.getA1Notation());

第四个问题很容易解决,只需使用getValue(). 在这种情况下,我创建了一个新变量来保存它。

var cellValue = cell.getValue();

第五个问题,检查单元格是否为空应该是测试它是否为空字符串。你可以通过几种方式做到这一点。一种是检查 [in] 等式 ( cellValue != ""),另一种是检查长度 ( cellValue.length > 0)。

为确保您正在更改变量的值,您可以再次使用Logger.log()语句。在我的示例中,您可以看到我正在更新这两行中的单元格和单元格值变量:

cell = cell.offset(1, 0);
cellValue = cell.getValue();

最后,Browser.msgBox()可能很棘手。它会暂停你的脚本,直到用户与它呈现的 UI 交互。如果从脚本编辑器运行脚本,您可能看不到消息框,因此脚本将无限期地继续运行。您可以尝试摆脱该行并仅Logger.log()在测试时使用,或者您可以创建自定义菜单以从电子表格 UI 触发脚本。

下面是完整的示例代码。您应该能够运行它并基于此对您的原始文件进行必要的修改。

function onOpen() {
  SpreadsheetApp.getUi()
  .createMenu("Test Menu")
  .addItem("Find first empty cell", "findFirstBlank")
  .addToUi();
}

function findFirstBlank() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var cell = ss.getCurrentCell();
  var cellValue = cell.getValue();

  // Check values
  Logger.log("Active Spreadsheet Name: " + ss.getName());
  Logger.log("Active Sheet Name: " + sheet.getName());
  Logger.log("Cell Address: " + cell.getA1Notation());

  while (cellValue != "") {
    cell = cell.offset(1, 0);
    cellValue = cell.getValue();
  }
  Logger.log("First Empty Cell: " + cell.getA1Notation());
  Logger.log("Complete!");
  Browser.msgBox("Complete!");
};

注意:这不处理没有空单元格的情况。鉴于您的特定要求,您绝对应该考虑如何最好地处理它。


推荐阅读