【问题标题】:How to check if cell if empty in Office.js如何检查 Office.js 中的单元格是否为空
【发布时间】:2018-12-02 15:23:25
【问题描述】:

我刚刚开始使用 Office 插件,并且正在试验这些功能。我有几个 VBA 用户表单,我想用 Office 加载项中的弹出窗口替换它们。

我正在使用以下代码将字符串输入到单元格中(没什么特别的,我知道),但我想在传递值之前检查单元格是否为空。如果是,请输入 (arg.message)。

我遇到的问题: 使用if (range.value == ""),即使“A3”为空,该值也在“A4”中设置; 如果 (range.value == " ") 没有在任何单元格中输入值。

谁能给我一个如何检查单元格是否为空的示例? 我知道这似乎微不足道,但我只找到了如何使用 col 和 row numbers 进行条件格式检查的示例。我正在尝试测试所有这些功能,以便能够开始将内容从 VBA 转移到 OfficeJS。

谢谢, 迈克

function processMessage(arg) {      
    console.log(arg.message);
    $('#user-name').text(arg.message);
    dialog.close();
    Excel.run(function (context) {
        var sheet = context.workbook.worksheets.getItem("Sheet1");
        var range = sheet.getRange("A3");
        if (range.value == "") {
            range.values = (arg.message);
            range.format.autofitColumns(); 
            return context.sync();
        } else {
            range.getOffsetRange(1, 0).values = (arg.message)
            return context.sync();
        }

    }).catch(errorHandler);
}

PS:整个代码,以防其他地方出现问题

   (function () {
            "use strict";
            // The initialize function must be run each time a new page is loaded.
            Office.initialize = function (reason) {
                $(document).ready(function () {

                    // Add a click event handler for the button.
                    $('#popup-button').click(opensesame);
                    $('#simple-button').click(function () {
                        Office.context.document.getSelectedDataAsync(Office.CoercionType.Text,
                        function (result) {
                            if (result.status === Office.AsyncResultStatus.Succeeded) {
                                $("#banner-text").text('The selected text is: "' + result.value + '"');
                                $("#banner").show(result.value);
                                console.log()
                            } else {
                                $("#banner-text").text('Error: ' + result.error.message);
                                $("#banner").show();
                            }
                        });
                    });

                    $("#banner-close").click(function () { $("#banner").hide(); });
                    $("#banner").hide();
                });
            }

            let dialog = null;

    function opensesame() {
        Office.context.ui.displayDialogAsync(
            'https://localhost:3000/popup.html',
            { height: 35, width: 25 },

            function (result) {
                dialog = result.value;
                dialog.addEventHandler(Microsoft.Office.WebExtension.EventType.DialogMessageReceived, processMessage);
            }
        );
    }

    function processMessage(arg) {


        console.log(arg.message);
        $('#user-name').text(arg.message);
        dialog.close();
        Excel.run(function (context) {
            var sheet = context.workbook.worksheets.getItem("Sheet1");
            var range = sheet.getRange("A3");
            if (range.value == "") {
                range.values = (arg.message);
                range.format.autofitColumns(); 
                return context.sync();
            } else {
                range.getOffsetRange(1, 0).values = (arg.message)
                return context.sync();
            }

        }).catch(errorHandler);
    }

        })();

【问题讨论】:

    标签: excel office-js excel-addins


    【解决方案1】:

    Range 对象具有values 属性,但没有值属性。所以range.value 在你的条件测试中是 undefined 不匹配空字符串;因此 else 子句运行。

    其他几件事:

    1. 您的条件尝试读取range 对象的属性。您必须先load 该属性并致电context.sync,然后才能阅读该属性。
    2. range.values 属性的值是一个二维数组(尽管如果范围是单个单元格,它可能只有一个值)。它不是字符串,因此将其与空字符串进行比较总是false

    如果我了解您的目标,我认为您应该测试range.values(在您加载并同步之后)在它的唯一单元格中是否有一个空字符串。例如,if (range.values[0][0] === "")。从性能的角度来看,更好的是加载 range.valueTypes 属性(和同步),然后像这样比较:if (range.valueTypes[0][0] === Excel.RangeValueType.empty)

    【讨论】:

    • 非常感谢您。我到了一半,到了我用var range = sheet.getRange("A3").load('values'); return context.sync() .then(function () { 加载属性的地步,但它加载了所有属性,你的方式更整洁。我是否正确假设(我知道,假设不好)但是如果该范围将包含例如 10 个单元格并且我将加载 range.valueTypes 我将能够遍历它们以检查第一个为空的单元格?类似于if (range.valueTypes[x][x] === Excel.RangeValueType.empty)?
    • 是的。您应该能够遍历并检查每个单元格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多