Google Sheets While循环直到找到空单元格

时间:2018-07-25 14:46:46

标签: google-apps-script google-sheets

我正在尝试在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!");
};

1 个答案:

答案 0 :(得分:0)

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

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

第五个问题,检查单元格是否为空应该测试其是否为空字符串。您可以通过几种方法来执行此操作。一种是检查[不相等](cellValue != ""),另一种是检查长度(cellValue.length > 0)。

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

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

最后,Browser.msgBox()可能很棘手。它将暂停您的脚本,直到用户与其显示的UI进行交互为止。如果从脚本编辑器运行脚本,则可能看不到消息框,因此脚本将继续无限期运行。您可以尝试摆脱该行,而在测试时仅使用Logger.log(),也可以创建一个custom menu从电子表格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!");
};

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