【问题标题】:Passing a dto to Google Apps Script method over Java/Python通过 Java/Python 将 dto 传递给 Google Apps 脚本方法
【发布时间】:2018-08-21 17:53:44
【问题描述】:

我在应用程序脚本中编写了一个原型函数

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 我能够传递这些 objectsArray 的列表,如下所示:

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 字符串传递,或者实现 Serializable 类:

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]

【问题讨论】:

    标签: java python function object google-apps-script


    【解决方案1】:

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

    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]
    

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多