我已经在apps脚本中编写了一个原型函数
function replaceWithObjects(documentId, objectsArray) {
Logger.log("replaceWithObjects call: documentId:" + documentId + " objectsArray:" + objectsArray);
var body = DocumentApp.openById(documentId).getBody();
var length = objectsArray.length;
for (i = 0; i < length; i++) {
var toReplace = '#{' + objectsArray[i].toReplace + '}';
var targetText = objectsArray[i].targetText;
Logger.log("To replace: " + toReplace + " with: " + targetText);
body.replaceText(toReplace, targetText);
}
}
使用python,我可以传递这些对象的列表如下:
a_replace = {"toReplace": "A", "targetText": "object_a"};
b_replace = {"toReplace": "B", "targetText": "object_b"};
c_replace = {"toReplace": "C", "targetText": "object_c"};
request = {"function": "replaceWithObjects", "parameters": [poc_doc_id, [a_replace,b_replace,c_replace]]}
然而,对于Java及其ExecutionRequest对象,当使用setParameters方法设置对象列表时,我不能做同样的事情
private static ExecutionRequest getExecutionRequest(String function, List<Object> parameters) {
ExecutionRequest executionRequest = new ExecutionRequest().setFunction(function);
if (parameters != null && !parameters.isEmpty()) {
executionRequest.setParameters(parameters);
}
return executionRequest;
}
我已尝试将列表中的对象作为json字符串或实现可序列化类传递:
public static class Replace extends Object implements Serializable {
public String toReplace;
public String targetText;
public Replace(String toReplace, String targetText) {
this.toReplace = toReplace;
this.targetText = targetText;
}
public String getToReplace() {
return toReplace;
}
public String getTargetText() {
return targetText;
}
}
但无济于事。python的使用能够让.toReplace和.targetText提供正确的值,但是java方面仍然是一个挑战。文档建议:“只能传递和返回基本类型,如字符串、数组、对象、数字和布尔值。”并且还没有找到传递对象的java示例。如果像python的概念验证那样支持对象传递,那么Java方面还缺少什么呢
Java尝试该方法的执行脚本:
[18-08-21 10:38:13:109 PDT] Starting execution
[18-08-21 10:38:13:116 PDT] Logger.log([replaceWithObjects call: documentId:1mfwAj_egf_00TrgP_ztjnr7zYJVc4rTy4vd140MvBwE objectsArray:[object Object],[object Object],[object Object], []]) [0 seconds]
[18-08-21 10:38:13:394 PDT] DocumentApp.openById([1mfwAj_egf_00TrgP_ztjnr7zYJVc4rTy4vd140MvBwE]) [0.276 seconds]
[18-08-21 10:38:13:394 PDT] Document.getBody() [0 seconds]
[18-08-21 10:38:13:395 PDT] Logger.log([To replace: #{undefined} with: undefined, []]) [0 seconds]
[18-08-21 10:38:13:396 PDT] Body.replaceText([#{undefined}, undefined]) [0 seconds]
[18-08-21 10:38:13:396 PDT] Logger.log([To replace: #{undefined} with: undefined, []]) [0 seconds]
[18-08-21 10:38:13:397 PDT] Body.replaceText([#{undefined}, undefined]) [0 seconds]
[18-08-21 10:38:13:398 PDT] Logger.log([To replace: #{undefined} with: undefined, []]) [0 seconds]
[18-08-21 10:38:13:398 PDT] Body.replaceText([#{undefined}, undefined]) [0 seconds]
[18-08-21 10:38:13:400 PDT] Execution succeeded [0.284 seconds total runtime]
python尝试此方法的执行脚本:
[18-08-21 10:49:04:524 PDT] Starting execution
[18-08-21 10:49:04:531 PDT] Logger.log([replaceWithObjects call: documentId:18BJyN3F0khcF9B4jrW89XMGtaVpOEZ3X-1c6-KakczM objectsArray:[object Object],[object Object],[object Object], []]) [0 seconds]
[18-08-21 10:49:04:576 PDT] DocumentApp.openById([18BJyN3F0khcF9B4jrW89XMGtaVpOEZ3X-1c6-KakczM]) [0.044 seconds]
[18-08-21 10:49:04:577 PDT] Document.getBody() [0 seconds]
[18-08-21 10:49:04:578 PDT] Logger.log([To replace: #{A} with: object_a, []]) [0 seconds]
[18-08-21 10:49:04:579 PDT] Body.replaceText([#{A}, object_a]) [0 seconds]
[18-08-21 10:49:04:579 PDT] Logger.log([To replace: #{B} with: object_b, []]) [0 seconds]
[18-08-21 10:49:04:580 PDT] Body.replaceText([#{B}, object_b]) [0 seconds]
[18-08-21 10:49:04:581 PDT] Logger.log([To replace: #{C} with: object_c, []]) [0 seconds]
[18-08-21 10:49:04:582 PDT] Body.replaceText([#{C}, object_c]) [0 seconds]
[18-08-21 10:49:04:647 PDT] Execution succeeded [0.052 seconds total runtime]
长话短说,将对象直接转换为hashmap节省了时间:
执行记录:
相关问题 更多 >
编程相关推荐