Office js 如何使用Office JavaScript API确保Excel Online请求小于5MB
显然,在Excel Online中发出请求时有5MB的限制(请参阅) 我们使用Office JavaScript API将大量数据写入Excel工作表,使用以下代码:Office js 如何使用Office JavaScript API确保Excel Online请求小于5MB,office-js,excel-online,Office Js,Excel Online,显然,在Excel Online中发出请求时有5MB的限制(请参阅) 我们使用Office JavaScript API将大量数据写入Excel工作表,使用以下代码: //示例行-在我们的实际代码中,这来自API 常量行=[ [“日期”、“产品”、“销售”、“客户”], [“13/03/2020”,“巧克力饼干”,598.00,93], //……还有更多 ] getRangeByIndexes(0,0,numRows,numColumns); 超过上述限制将导致抛出此错误:RichApi.er
//示例行-在我们的实际代码中,这来自API
常量行=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
]
getRangeByIndexes(0,0,numRows,numColumns);
超过上述限制将导致抛出此错误:RichApi.error:发生内部错误。
生成时,行数和列数未知;数据的大小取决于外接程序用户运行的查询
是否有可靠的方法确保我们的请求不超过限制?
我尝试跟踪JSON序列化值数组的大小,并允许一些开销因素:
Excel.run(异步上下文=>{
const sheet=context.workbook.worksheets.add();
//5MB的50%:允许50%的开销
常数阈值=0.5*(5*1000*1000);
设字节=0;
//示例行-在我们的实际代码中,这来自一个API
常数numColumns=4;
常量行=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
];
for(让rowIndex=0;rowIndex=阈值){
wait context.sync();
字节=0;
}
}
返回context.sync();
}
即使允许50%的开销,对
context.sync()
的调用仍然抛出RichApi.Error:发生了一个内部错误。
带有一些数据。也许我可以将其设置为非常低的值(比如10%)但在大多数情况下,这将是非常低效的。我希望有一种更可靠的方法来计算有效负载大小,或者有一种方法来询问Office API以检查挂起的请求的大小。请求有效负载大小与:
-API调用的计数
-对象的计数(例如范围对象)
-要设置的值的长度
所以为了提高脚本的效率,需要优化尽可能小的API调用数。如果要为每行调用Range.Values API,将有更多的负载开销
下面是一个带有优化API调用的示例,以供参考:
const newValues = [
["Date", "Product", "Sales", "Customers"],
["13/03/2020", "Chocolate biscuits", 598.00, 93],
// ... and many more
];
for (let rowIndex = 0; rowIndex < newValues.length;) {
const row = newValues[rowIndex];
var bytes = JSON.stringify([row]).length;
var valuesToSet = [];
valuesToSet.push(row);
var rowCountForNextBatch = 1;
for (; (rowIndex + rowCountForNextBatch) < newValues.length; rowCountForNextBatch++) {
const nextRow = newValues[rowIndex + rowCountForNextBatch];
bytes += JSON.stringify([nextRow]).length;
if (bytes >= THRESHOLD) {
break;
}
valuesToSet.push(nextRow);
}
console.log(valuesToSet);
console.log(rowCountForNextBatch);
sheet.getRangeByIndexes(rowIndex, 0, rowCountForNextBatch, numColumns).values = valuesToSet;
await context.sync();
rowIndex += rowCountForNextBatch;
}
const newValues=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
];
for(让rowIndex=0;rowIndex=阈值){
打破
}
值设置推送(下一步);
}
console.log(valuesToSet);
console.log(下一批的行计数);
sheet.getRangeByIndexes(rowIndex,0,下一个批次的RowCount,numColumns)。值=值设置;
wait context.sync();
rowIndex+=下一批次的行数;
}
请求有效负载大小与:
-API调用的计数
-对象的计数(例如范围对象)
-要设置的值的长度
所以为了提高脚本的效率,需要优化尽可能小的API调用数。如果要为每行调用Range.Values API,将有更多的负载开销
下面是一个带有优化API调用的示例,以供参考:
const newValues = [
["Date", "Product", "Sales", "Customers"],
["13/03/2020", "Chocolate biscuits", 598.00, 93],
// ... and many more
];
for (let rowIndex = 0; rowIndex < newValues.length;) {
const row = newValues[rowIndex];
var bytes = JSON.stringify([row]).length;
var valuesToSet = [];
valuesToSet.push(row);
var rowCountForNextBatch = 1;
for (; (rowIndex + rowCountForNextBatch) < newValues.length; rowCountForNextBatch++) {
const nextRow = newValues[rowIndex + rowCountForNextBatch];
bytes += JSON.stringify([nextRow]).length;
if (bytes >= THRESHOLD) {
break;
}
valuesToSet.push(nextRow);
}
console.log(valuesToSet);
console.log(rowCountForNextBatch);
sheet.getRangeByIndexes(rowIndex, 0, rowCountForNextBatch, numColumns).values = valuesToSet;
await context.sync();
rowIndex += rowCountForNextBatch;
}
const newValues=[
[“日期”、“产品”、“销售”、“客户”],
[“13/03/2020”,“巧克力饼干”,598.00,93],
//……还有更多
];
for(让rowIndex=0;rowIndex=阈值){
打破
}
值设置推送(下一步);
}
console.log(valuesToSet);
console.log(下一批的行计数);
sheet.getRangeByIndexes(rowIndex,0,下一个批次的RowCount,numColumns)。值=值设置;
wait context.sync();
rowIndex+=下一批次的行数;
}
可以进一步说明为什么跟踪JSON的大小不可靠?出了什么问题?基本上我做的是:javascript让bytes=0;for(const row of rows){sheet.getRangeByIndexes(0,0,numRows,numColumns)。value=row.values;bytes+=JSON.stringify(row.values)。length;if(bytes>THRESHOLD){wait context.sync();}}
我基本上必须将阈值设置为相当低的值,比如500000
,这样才能工作,即使这样,它也不总是工作,所以我想我的字节估计一定是做错了什么。我不知道引擎盖下发生了什么,所以做出一些类似的假设似乎很危险。谢谢,但请继续用代码编辑您的原始问题,而不是将其放在注释中,以使其可读。请提供更多代码。我无法区分行
是Office对象还是您自己的对象。此外,请比“并非始终有效”等短语更具体。您能检查一下单元格内容是否超过65535字节吗?您能进一步说明为什么跟踪JSON的大小不可靠吗?出了什么问题吗?基本上我做的是: