別の「簡単なはず」の問題があります。すべてのフィールドが入力されていることを確認する必要がある ScriptUI ウィンドウがあります。ユーザーが「OK」ボタンをクリックすると、スクリプトはフィールドが入力されていることを確認します。そうでない場合は、ユーザーにそうするように警告し、入力するまで同じウィンドウを再度表示する必要があります。全く。これが私がこれまでに持っているものです:
var windowTitle = "Output Script v1.00 by Chris McGee";
var curDate = new Date();
var curDay = curDate.getDate();
var curMonth = curDate.getMonth() + 1;
var curYear = curDate.getYear() - 100;
var dateFormat = /^(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.]\d\d$/;
var outputData = new Window("dialog", windowTitle);
outputData.preferredSize = [337, 286];
outputData.orientation = "stack";
outputData.margins = 0;
var stackGroup = outputData.add("group");
stackGroup.margins = [0, 55, 0, 0];
stackGroup.alignment = ["", "top"];
stackGroup.alignChildren = ["", "top"];
var textPanel = stackGroup.add("panel");
textPanel.orientation = "row";
textPanel.alignChildren = ["", "bottom"];
var staticGroup = textPanel.add("group");
staticGroup.orientation = "column";
staticGroup.alignChildren = "right";
staticGroup.spacing = 16;
staticGroup.add("statictext", undefined, "&Order Number:");
staticGroup.add("statictext", undefined, "&Ship Date:");
staticGroup.add("statictext", undefined, "&Initials:");
staticGroup.add("statictext", undefined, "Ove&rruns?");
var editGroup = textPanel.add("group");
editGroup.orientation = "column";
editGroup.alignChildren = "left";
var orderNumText = editGroup.add("edittext");
orderNumText.characters = 8;
orderNumText.active = true;
orderNumText.onChange = function ()
{
if (!/\b\d{6}\b/.test(orderNumText.text))
{
// If the entered text does not contain exactly 6 digits.
alert("The order number does not appear to conform to a standard order number.\n Please fix and try again.");
}
}
var shipDateText = editGroup.add("edittext");
shipDateText.characters = 8;
shipDateText.onChange = function ()
{
if (dateFormat.test(shipDateText.text))
{
var enteredDate = shipDateText.text.match(/\b\d*\b/g);
var entMonth = parseInt(enteredDate[0]);
var entDay = parseInt(enteredDate[2]);
var entYear = parseInt(enteredDate[4]);
if (entYear < curYear || entYear > curYear + 1)
{
// If the entered year is older than the current year, or
// if the entered year is two or more years in the future.
alert("Invalid date entered. Please fix.");
}
else if ((entYear > curYear && curMonth < 12) || entMonth > curMonth + 1)
{
// If the entered month is more than one month ahead, just verify that it is correct.
alert("Please verify that the entered date is correct before proceeding.");
}
else if ((entMonth < curMonth && curMonth < 12) || (entMonth == curMonth && entDay < curDay))
{
// If the entered date is within the same month, but on an earlier day, alert the user.
alert("Invalid date entered. Please fix.");
}
}
else
{
alert("Date format not recognized. Please try again.\nDate must be in the form of MM/DD/YY.");
shipDateText.text = "";
}
}
var initialsText = editGroup.add("edittext");
initialsText.characters = 3;
var overRunsBox = editGroup.add("checkbox");
var buttonGroup = stackGroup.add("group");
buttonGroup.orientation = "column";
var okButton = buttonGroup.add("button", undefined, "OK", {name: "ok"});
buttonGroup.add("button", undefined, "Cancel", {name: "cancel"});
var allFieldsFilled = false;
while (!allFieldsFilled)
{
// If the user clicked "OK", then the contents get put into variables and the work begins on the document(s).
if (outputData.show() == 1) {
if (orderNumText.text == "" || shipDateText.text == "" || initialsText.text == "")
{
alert("Please fill out ALL fields.");
}
else
{
allFieldsFilled = true;
var orderNum = orderNumText.text;
var shipDate = shipDateText.text;
var outputInitials = initialsText.text;
var overRuns = overRunsBox.value;
}
} else {
// If the user clicked "Cancel".
exit();
}
}
問題は、警告メッセージの後にウィンドウが再表示されないことです。なぜそうならないのですか?どうすれば修正できますか?
EDIT 09/23/2013 : 実行できるようにコードを追加しました。また、ユーザーが [キャンセル] をクリックしても、テキストの入力に関する警告ウィンドウが表示されることに気付きました。
EDIT 09/24/2013 : @ariestav のアイデアを実装しようとしたので、コードは次のようになりました。
var outputData = new Window("dialog", windowTitle);
outputData.preferredSize = [337, 286];
outputData.orientation = "stack";
outputData.margins = 0;
var stackGroup = outputData.add("group");
stackGroup.margins = [0, 55, 0, 0];
stackGroup.alignment = ["", "top"];
stackGroup.alignChildren = ["", "top"];
var textPanel = stackGroup.add("panel");
textPanel.orientation = "row";
textPanel.alignChildren = ["", "bottom"];
var staticGroup = textPanel.add("group");
staticGroup.orientation = "column";
staticGroup.alignChildren = "right";
staticGroup.spacing = 16;
staticGroup.graphics.foregroundColor = staticGroup.graphics.newPen(outputData.graphics.PenType.SOLID_COLOR, [1, 1, 1], 1);
staticGroup.add("statictext", undefined, "&Order Number:");
staticGroup.add("statictext", undefined, "&Ship Date:");
staticGroup.add("statictext", undefined, "&Initials:");
staticGroup.add("statictext", undefined, "Ove&rruns?");
var editGroup = textPanel.add("group");
editGroup.orientation = "column";
editGroup.alignChildren = "left";
var orderNumText = editGroup.add("edittext");
orderNumText.characters = 8;
orderNumText.active = true;
orderNumText.onChange = function ()
{
if (!/\b\d{6}\b/.test(orderNumText.text))
{
// If the entered text does not contain exactly 6 digits.
alert("The order number does not appear to conform to a standard order number.\n Please fix and try again.");
}
}
var shipDateText = editGroup.add("edittext");
shipDateText.characters = 8;
shipDateText.onChange = function ()
{
if (dateFormat.test(shipDateText.text))
{
var enteredDate = shipDateText.text.match(/\b\d*\b/g);
var entMonth = parseInt(enteredDate[0]);
var entDay = parseInt(enteredDate[2]);
var entYear = parseInt(enteredDate[4]);
if (entYear < curYear || entYear > curYear + 1)
{
// If the entered year is older than the current year, or
// if the entered year is two or more years in the future.
alert("Invalid date entered. Please fix.");
}
else if ((entYear > curYear && curMonth < 12) || entMonth > curMonth + 1)
{
// If the entered month is more than one month ahead, just verify that it is correct.
alert("Please verify that the entered date is correct before proceeding.");
}
else if ((entMonth < curMonth && curMonth < 12) || (entMonth == curMonth && entDay < curDay))
{
// If the entered date is within the same month, but on an earlier day, alert the user.
alert("Invalid date entered. Please fix.");
}
}
else
{
alert("Date format not recognized. Please try again.\nDate must be in the form of MM/DD/YY.");
shipDateText.text = "";
}
}
var initialsText = editGroup.add("edittext");
initialsText.characters = 3;
var overRunsBox = editGroup.add("checkbox");
var buttonGroup = stackGroup.add("group");
buttonGroup.orientation = "column";
var okButton = buttonGroup.add("button", undefined, "OK", {name: "ok"});
okButton.onClick = function ()
{
if (orderNumText.text == "" || shipDateText.text == "" || initialsText.text == "")
{
alert("Please fill out ALL fields.");
}
else
{
outputData.close();
}
}
var cancelButton = buttonGroup.add("button", undefined, "Cancel", {name: "cancel"});
cancelButton.onClick = function () {$.writeln("Canceling."); outputData.close(); exit();}
outputData.show();
var orderNum = orderNumText.text;
var shipDate = shipDateText.text;
var outputInitials = initialsText.text;
var overRuns = overRunsBox.value;
ただし、キャンセル ボタンはキャンセルしません。コードを続行するだけです。exit();
ディレクティブにより、スクリプトから完全に終了するだけだと思いました。私は何を間違っていますか?