Я работаю над настраиваемой надстройкой Excel и хочу использовать EntityValue для создания поведения, аналогичного встроенному типу данных акций (и документация здесь: https://github.com/officeedev/office-add -in-samples/tree/main/samples/excel-data-types-explorer). Тем не менее, EntityValue, похоже, не сохраняется за пределами функции, в которой она создается, поэтому, когда я иду, чтобы прочитать EntityValues, это не определен. manifest.xml (в начинном начинке): < /p>
TestData
< /code>
Таким образом, все, что мы действительно захватываем в этом образце, это количество и цена для продукта. Имя (скажем, «Молотки») и запустите команду из ленты, которая преобразует эту ячейку в объект TestData: < /p>
async function createProductDataType(event) {
try {
await Excel.run(async (context) => {
// Get the currently selected cell.
const range = context.workbook.getSelectedRange();
range.load(["address", "values", "entityValue"]);
await context.sync();
console.log("Converting cell to Product Data Type...");
// Assume the user entered a product into the cell.
const productID = range.values[0][0];
console.log("Product ID: " + productID);
// Populate additional details for the product (just for testing)
const productData = {
prdID: productID,
quantity: 123,
price: 2.95,
};
console.log("productData:" + JSON.stringify(productData, null, 2));
// Just write the a version of productID to verify
range.values = [["product type: " + productID]];
console.log("Range Values: " + JSON.stringify(range.values, null, 2));
// Create an object that conforms to the Excel.EntityValue interface.
const productEntity = {
entityType: "TestData", // matches the type defined in the manifest.
prdID: productID, // A unique identifier for the entity instance.
data: productData, // The detailed data for the entity.
};
// Assign productEntity to the entityValue property of the cell.
range.entityValue = productEntity;
// Update the cell's format to indicate it’s been converted.
range.format.fill.color = "#88D3AF";
range.load(["entityValue", "entityValue/entityType"]);
await context.sync();
// Verify the data in the cell
console.log("Entity Value:" + JSON.stringify(range.entityValue, null, 2));
console.log("Cell type: " + range.entityValue.entityType);
await context.sync();
});
} catch (error) {
console.log("Error in product Data Type creation: " + error);
} finally {
// Notify the host that the command function is complete.
event.completed();
}
}
< /code>
Вызывая эту функцию из ленты ведет себя так, как и ожидалось. Консоль обновляется следующим образом: < /p>
[Log] "Converting cell to Product Data Type..."
[Log] "Product ID: Hammers"
[Log] "productData:{\n \"prdID\": \"Hammers\",\n \"quantity\": 123,\n \"price\": 2.95\n}"
[Log] "Range Values:[\n [\n \"product type: Hammers\"\n ]\n]"
[Log] "Entity Value:{\n \"entityType\": \"TestData\",\n \"prdID\": \"Hammers\",\n \"data\": {\n \"prdID\": \"Hammers\",\n \"quantity\": 123,\n \"price\": 2.95\n }\n}"
[Log] "Cell type: TestData"
< /code>
Пока что (вроде) хорошо. Если я попытаюсь извлечь какие -либо данные из другой ячейки (например, a2.quantity), это вернет ошибку #field! (И не было никаких изменений в ячейке, где мы создали этот тип данных объекта с небольшим значком). < /p>
Однако для проверки я создал вторую функцию, которая запрашивает, что ячейка для получения объекта ДАННЫЕ: (Имя функции не имеет значения, это просто код для проверки): < /p>
// Get the currently selected cell.
const range = context.workbook.getSelectedRange();
range.load(["address", "values", "entityValue"]);
await context.sync();
console.log("Checking on entity data for cell from another function...");
console.log("Value of CELL: " + range.values[0][0]);
console.log("Entity Value CELL: " + JSON.stringify(range.entityValue, null, 2));
< /code>
Когда я смотрю на журнал консоли для этого, вот что я вижу: < /p>
[Log] "Checking on entity data for cell from another function..."
[Log] "Value of CELL: product type: Hammers"
[Log] "Entity Value CELL: undefined"
Итак, кажется, что EntityValue/Type на самом деле не был установлен в ячейке.
Что я делаю не так? (Запуск последней бета -версии Excel, и я установил требования для версии Excelapi на 1.18).
Я работаю над настраиваемой надстройкой Excel и хочу использовать EntityValue для создания поведения, аналогичного встроенному типу данных акций (и документация здесь: https://github.com/officeedev/office-add -in-samples/tree/main/samples/excel-data-types-explorer). Тем не менее, EntityValue, похоже, не сохраняется за пределами функции, в которой она создается, поэтому, когда я иду, чтобы прочитать EntityValues, это не определен. manifest.xml (в начинном начинке): < /p> [code] TestData
< /code> Таким образом, все, что мы действительно захватываем в этом образце, это количество и цена для продукта. Имя (скажем, «Молотки») и запустите команду из ленты, которая преобразует эту ячейку в объект TestData: < /p> async function createProductDataType(event) { try { await Excel.run(async (context) => { // Get the currently selected cell. const range = context.workbook.getSelectedRange(); range.load(["address", "values", "entityValue"]); await context.sync();
console.log("Converting cell to Product Data Type...");
// Assume the user entered a product into the cell. const productID = range.values[0][0];
console.log("Product ID: " + productID);
// Populate additional details for the product (just for testing) const productData = { prdID: productID, quantity: 123, price: 2.95, };
// Create an object that conforms to the Excel.EntityValue interface. const productEntity = { entityType: "TestData", // matches the type defined in the manifest. prdID: productID, // A unique identifier for the entity instance. data: productData, // The detailed data for the entity. };
// Assign productEntity to the entityValue property of the cell. range.entityValue = productEntity;
// Update the cell's format to indicate it’s been converted. range.format.fill.color = "#88D3AF";
// Verify the data in the cell console.log("Entity Value:" + JSON.stringify(range.entityValue, null, 2)); console.log("Cell type: " + range.entityValue.entityType);
await context.sync(); }); } catch (error) { console.log("Error in product Data Type creation: " + error); } finally { // Notify the host that the command function is complete. event.completed(); } } < /code> Вызывая эту функцию из ленты ведет себя так, как и ожидалось. Консоль обновляется следующим образом: < /p> [Log] "Converting cell to Product Data Type..." [Log] "Product ID: Hammers" [Log] "productData:{\n \"prdID\": \"Hammers\",\n \"quantity\": 123,\n \"price\": 2.95\n}" [Log] "Range Values:[\n [\n \"product type: Hammers\"\n ]\n]" [Log] "Entity Value:{\n \"entityType\": \"TestData\",\n \"prdID\": \"Hammers\",\n \"data\": {\n \"prdID\": \"Hammers\",\n \"quantity\": 123,\n \"price\": 2.95\n }\n}" [Log] "Cell type: TestData" < /code> Пока что (вроде) хорошо. Если я попытаюсь извлечь какие -либо данные из другой ячейки (например, a2.quantity), это вернет ошибку #field! (И не было никаких изменений в ячейке, где мы создали этот тип данных объекта с небольшим значком). < /p> Однако для проверки я создал вторую функцию, которая запрашивает, что ячейка для получения объекта ДАННЫЕ: (Имя функции не имеет значения, это просто код для проверки): < /p> // Get the currently selected cell. const range = context.workbook.getSelectedRange(); range.load(["address", "values", "entityValue"]); await context.sync();
console.log("Checking on entity data for cell from another function..."); console.log("Value of CELL: " + range.values[0][0]); console.log("Entity Value CELL: " + JSON.stringify(range.entityValue, null, 2)); < /code> Когда я смотрю на журнал консоли для этого, вот что я вижу: < /p> [Log] "Checking on entity data for cell from another function..." [Log] "Value of CELL: product type: Hammers" [Log] "Entity Value CELL: undefined" [/code] Итак, кажется, что EntityValue/Type на самом деле не был установлен в ячейке. Что я делаю не так? (Запуск последней бета -версии Excel, и я установил требования для версии Excelapi на 1.18).