【发布时间】:2014-05-06 01:14:54
【问题描述】:
我正在编写一个用于 google 电子表格的脚本。我希望脚本循环浏览 URL 电子表格。在循环过程中,该函数应该调用一个 UI 实例,该实例显示 url 链接并接收有关 url 为“当前”或“过期”的用户输入,并将其标记为电子表格。
理想情况下,在用户选择一个选项并单击“下一步”按钮后,该 url 的对话框将关闭,而下一个 url 的对话框将打开。
代码如下。
function getUrlsToCheck(){
/**
* Asks user to input range of urls to check.
*/
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheets()[0];
// Prompt the user for the range with the starting row and ending row.
var rowStart = Browser.inputBox('Starting Entry',
'Please enter the starting row of the urls you want to check' +
' (for example, "1"):',
Browser.Buttons.OK_CANCEL);
if (rowStart == 'cancel') {
return;
}
var rowNumber1 = Number(rowStart);
if (isNaN(rowNumber1) || rowNumber1 < 2 ||
rowNumber1 > spreadsheet.getLastRow()) {
Browser.msgBox('Error',
Utilities.formatString('Row "%s" is not a valid starting point.', rowStart),
Browser.Buttons.OK);
return;
}
var rowEnd = Browser.inputBox('Ending Entry',
'Please enter the ending row of the urls you want to check' +
' (for example, "56"):',
Browser.Buttons.OK_CANCEL);
if (rowEnd == 'cancel') {
return;
}
var rowNumber2 = Number(rowEnd);
if (isNaN(rowNumber2) || rowNumber2 < rowNumber1 || rowNumber1 == rowNumber2) {
Browser.msgBox('Error',
Utilities.formatString('Row "%s" is not a valid ending point.', rowEnd),
Browser.Buttons.OK);
return;
}
var numOfRowsToCheck = (rowNumber2 - rowNumber1);
var range = sheet.getRange(rowNumber1, 1, (numOfRowsToCheck + 1), 1);
var data = range.getValues();
/*
*Loop to retrieve URLs and show a link in the Ui instance
*/
for(var i = 0; i < data.length; i++) {
var activeRow = (Number(i) + rowNumber1);
var range4 = sheet.getRange(activeRow, 4);
var range5 = sheet.getRange(activeRow, 5);
var app = UiApp.createApplication().setHeight(150).setWidth(250);
app.setTitle("Check URL");
var link1 = app.createAnchor('Check', data[i]);
var panel = app.createVerticalPanel();
var infoLabel = app.createLabel(Utilities.formatString('Check the link for entry %s', activeRow)).setId('infoLabel');
var infoLabel1 = app.createLabel('').setId('infoLabel1');
var current = app.createRadioButton("group", "Current").setName('current').setId('current');
var expired = app.createRadioButton("group", "Expired").setName('expired').setId('expired');
var hidden = app.createHidden("yourObject", Utilities.jsonStringify(activeRow));
var handler = app.createServerChangeHandler('current');
handler.addCallbackElement(panel).addCallbackElement(hidden);
current.addClickHandler(handler);
var handler2 = app.createServerChangeHandler('expired');
handler2.addCallbackElement(panel).addCallbackElement(hidden);
expired.addClickHandler(handler2);
var next = app.createButton('Next').setId('next');
var handler3 = app.createServerHandler('next');
handler3.addCallbackElement(panel);
next.addClickHandler(handler3);
panel.setSpacing(5);
panel.add(infoLabel);
panel.add(link1);
panel.add(current);
panel.add(expired);
panel.add(infoLabel1);
panel.add(next);
app.add(panel);
spreadsheet.show(app);
}
}
function next(e){
var app = UiApp.getActiveApplication();
app.close();
return app;
}
function current(e){
var app = UiApp.getActiveApplication();
app.getElementById('expired').setValue(false);
var yourObj = Utilities.jsonParse(e.parameter.yourObject);
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheets()[0];
var range4 = sheet.getRange(yourObj, 4);
var range5 = sheet.getRange(yourObj, 5);
range4.setValue('x');
range5.setValue('');
app.getElementById('infoLabel1').setText('This link has been marked current');
return app;
}
function expired(e){
var app = UiApp.getActiveApplication();
app.getElementById('current').setValue(false);
var yourObj = Utilities.jsonParse(e.parameter.yourObject);
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheets()[0];
var range4 = sheet.getRange(yourObj, 4);
var range5 = sheet.getRange(yourObj, 5);
range4.setValue('');
range5.setValue('x');
app.getElementById('infoLabel1').setText('This link has been marked expired');
return app;
}
我遇到的问题是循环循环时,没有足够的时间让接受用户信息的对话框加载;所以你只会看到最后一个 url 的对话框。
我尝试了几件事,但我一定做错了,因为它们没有奏效。
我已尝试插入系统暂停。
我也尝试过将该函数设为生成器函数,但
yield 命令编译不正确。我也尝试过使用 do while 循环而不是 for 循环。
虽然条件与下一个按钮是否是相关的
已禁用。
关于如何让函数的每一步在循环结束之前执行有什么建议吗?
【问题讨论】:
-
我对谷歌电子表格的经验很少,但这里有一个可能可行的建议:您能否将脚本分解为 2 个或更多脚本,并在用户单击链接为当前或已过期时运行脚本?
标签: javascript for-loop google-apps-script google-sheets do-while