通过Java/Python将dto传递给googleapps脚本方法

2024-10-03 21:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在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]

Tags: to对象logobjectwithloggerreplaceseconds
1条回答
网友
1楼 · 发布于 2024-10-03 21:26:36

长话短说,将对象直接转换为hashmap节省了时间:

public Object asHashMap() {
            HashMap<String, String> hashMap = new HashMap<>();
            hashMap.put("toReplace", toReplace);
            hashMap.put("targetText", targetText);
            return hashMap;
        }

执行记录:

[18-08-21 12:09:29:338 PDT] Starting execution
[18-08-21 12:09:29:345 PDT] Logger.log([replaceWithObjects call: documentId:1rHYqdUSbfgUjAa1T4x_FxFY1sN907ClcEuFKgjKbPuA objectsArray:[object Object],[object Object],[object Object], []]) [0 seconds]
[18-08-21 12:09:29:404 PDT] DocumentApp.openById([1rHYqdUSbfgUjAa1T4x_FxFY1sN907ClcEuFKgjKbPuA]) [0.058 seconds]
[18-08-21 12:09:29:405 PDT] Document.getBody() [0 seconds]
[18-08-21 12:09:29:406 PDT] Logger.log([To replace: #{A} with: hashmap_a, []]) [0 seconds]
[18-08-21 12:09:29:407 PDT] Body.replaceText([#{A}, wiggle_a]) [0 seconds]
[18-08-21 12:09:29:407 PDT] Logger.log([To replace: #{B} with: hashmap_b, []]) [0 seconds]
[18-08-21 12:09:29:408 PDT] Body.replaceText([#{B}, luke_b]) [0 seconds]
[18-08-21 12:09:29:408 PDT] Logger.log([To replace: #{C} with: hashmap_c, []]) [0 seconds]
[18-08-21 12:09:29:409 PDT] Body.replaceText([#{C}, insane_c]) [0 seconds]
[18-08-21 12:09:29:490 PDT] Execution succeeded [0.065 seconds total runtime]

相关问题 更多 >