google-apps-script - 循环使用 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!");
};
解决方案
有几个问题可能会影响您:
- 没有活动的电子表格。
- 活动工作表不是您认为的工作表。
- 当前单元格不是您认为的那个。
- 您正在尝试检查当前单元格的值,但没有得到它的值。
- 您检查单元格是否为空的条件是错误的。
- 你永远不会改变
cc
. 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!");
};
注意:这不处理没有空单元格的情况。鉴于您的特定要求,您绝对应该考虑如何最好地处理它。
推荐阅读
- python - tfidf 矢量化器输出全部为零
- java - Java Selenium 测试 driver.close() 和 driver.quit() Firefox 问题
- python - 如何在 Pandas Dataframe 中组织 Selenium 中的字符串?
- hyperledger-fabric - 如何在超级账本结构中创建单一组织的网络?
- itext - 将pdf页面转换为itext中的图像
- android - 以编程方式更新后 Android 10 APK 重启
- typescript - Vuejs Typescript 类组件 refs.focus 不起作用
- c# - 不活动后asp.net超时,清晰度问题
- react-native - React Native 找不到变量:样式?
- google-analytics - 分析 UTM 标记显示加扰的活动和媒体信息