0

別の「簡単なはず」の問題があります。すべてのフィールドが入力されていることを確認する必要がある 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();ディレクティブにより、スクリプトから完全に終了するだけだと思いました。私は何を間違っていますか?

4

2 に答える 2

0

したがって、この問題に対する最も簡単な解決策は、ほとんど文書化されていないものでした。この.enabledプロパティは、(ほぼ) すべての ScriptUI オブジェクトに使用できることがわかりました。したがって、すべてのフィールドが検証に合格するまで、[ OK ] ボタンを無効にしておくことができます。これには別の関数が必要でしたが、問題なく動作します。

function ifFieldsFilled ()
{
    if (orderNumText.text != "" && shipDateText.text != "" && initialsText.text != "" && dateValid)
    {
        return true;
    }
    else
    {
        return false;
    }
}

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 dateValid = false;

var outputData = new Window("dialog", windowTitle);
    outputData.preferredSize = [337, 300];
    outputData.orientation = "stack";
    outputData.margins = 0;
    var stackGroup = outputData.add("group");
        stackGroup.margins = [0, 48, 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?");
                staticGroup.add("statictext", undefined, "Digital &Print?");
            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) && 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.");
                        }
                        okButton.enabled = ifFieldsFilled();
                    }
                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.");
                                dateValid = false;
                            }
                            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.");
                                dateValid = false;
                            }
                            else
                            {
                                // The date is completely valid.
                                dateValid = true;
                            }
                        }
                        else
                        {
                            alert("Date format not recognized.  Please try again.\nDate must be in the form of MM/DD/YY.");
                            shipDateText.text = "";
                        }
                        okButton.enabled = ifFieldsFilled();
                    }
                var initialsText = editGroup.add("edittext");
                    initialsText.characters = 3;
                    initialsText.onChanging = function ()
                    {
                        okButton.enabled = ifFieldsFilled();
                    }
                var overRunsBox = editGroup.add("checkbox");
                var digitalPrintBox = editGroup.add("checkbox");
        var buttonGroup = stackGroup.add("group");
            buttonGroup.orientation = "column";
            var okButton = buttonGroup.add("button", undefined, "OK", {name: "ok"});
                okButton.enabled = false;
            var cancelButton = buttonGroup.add("button", undefined, "Cancel", {name: "cancel"});

// If the user clicked "OK", then the contents get put into variables and the work begins on the document(s).
if (outputData.show() == 1) {
    var orderNum = orderNumText.text;
    var shipDate = shipDateText.text;
    var outputInitials = initialsText.text;
    var overRuns = overRunsBox.value;
    var digitalPrint = digitalPrintBox.value;
} else {
    // If the user clicked "Cancel".
    exit();
}

そこからコードが続きます。

したがって、 はokButton無効になっている状態から始まり、ユーザーがフィールドに入力するたびに、またはフィールドの場合はinitialsTextユーザーが何かを入力しているときにチェックします。また、の関数&& orderNumText.text != ""に追加された追加の条件は、ユーザーがテキスト ボックスに入力する前に[ESC] を押すか [キャンセル] ボタンをクリックした場合に、煩わしい警告ダイアログが表示されないようにするためだけのものです。orderNumText.onChange()

つまり、この卑劣な小さな.enabledプロパティが、この問題を解決するのに役立つ鍵でした。振り返ってみると、明らかな答えのようなものです。とにかく、これがこの問題に似た問題を経験している他の人に役立つことを願っています. 気をつけて!

于 2013-12-03T15:35:21.120 に答える