【问题标题】:How to execute Data Transfer API?如何执行数据传输 API?
【发布时间】:2020-12-10 02:37:56
【问题描述】:

我有几个帐户需要将所有权转移到另一个帐户。我在谷歌表格中列出了所有电子邮件地址的列表。我正在使用下面的代码来执行它,但我不确定使用什么来执行代码。

function dataTransfer() {
      var ss = SpreadsheetApp.openById("SHEETID")
      var sheet = ss.getSheetByName("SHEETNAME");
      var start = 2;
      var end = sheet.getLastRow();
      
      var range = sheet.getRange(start,1,end,sheet.getLastColumn());
      var values = range.getValues();
      
      for (var i = 0; i < values.length-1; i++) {
        
        /* transfer the data ownership to */
        var A = "aUser@company1.com";
        var B = "bUser@company1.com";
        var C = "cUser@company1.com";
       
        var email = values[i][0];
        var company = values[i][1];
        var status = values[i][3];
        
        if (status === "Complete") {continue;}
        
        if (company == "A") {
            /* transfer of the ownership of user data between users. */
          var transferObject = {
            "kind": "admin#datatransfer#DataTransfer",
            "oldOwnerUserId": email,
            "newOwnerUserId": A,
            "applicationDataTransfers": [
              {
                "applicationId": XXXXXX,
                "applicationTransferParams": [{
                  "key": "PRIVACY_LEVEL",
                  "value": [
                    "PRIVATE",
                    "SHARED"
                  ]
                }],     
              "applicationId": XXXXX,
                "applicationTransferParams": [{
                  "key": "RELEASE_RESOURCES",
                  "value": true
                }],
              }],
          }
          **admin.datatransfer....** /* what do I use here to execute the above code */
          sheet.getRange(start+i,4,1,1).setValue("Complete");      
        }
    }
  }
}

【问题讨论】:

    标签: google-apps-script google-admin-sdk google-data-api


    【解决方案1】:

    答案:

    使用UrlFetchApp,您需要向https://admin.googleapis.com/admin/datatransfer/v1/transfers 发出POST 请求。您必须设置 GCP 项目并启用数据传输 API 才能执行此操作。

    更多信息:

    使用数据传输 API 的先决条件,根据this page 状态(强调我自己的):

    您需要以下基本配置才能使用数据传输 API:

    • 拥有 Google 帐户并创建管理员。该 API 适用于 Google Workspace、Education、Government、Reseller 和 ISP 帐户。
    • 熟悉您在 admin.google.com 上的 Google Workspace 管理控制台。如需详细了解管理控制台,请参阅使用管理控制台。
    • 从 Google Workspace 管理控制台启用 API 访问,以便向 Data Transfer API 发出请求。

    您可以通过转到console.cloud.google.com 并从上方菜单栏上Google Cloud Platform 旁边的下拉菜单中创建一个新项目来执行此操作。

    然后,使用汉堡菜单关注≡ &gt; APIs &amp; Services &gt; Library 并搜索Admin SDK API。点击匹配结果,在新页面点击ENABLE按钮。

    接下来,您需要将此 GCP 项目链接到您的 Apps 脚本项目。

    返回汉堡菜单,跟随≡ &gt; Home &gt; Dashboard,复制Project info区域下方显示的12位项目编号。

    回到您的脚本,按照Resources &gt; Cloud Platform project... 菜单项,粘贴该12 位数字并单击Set Project。这会将您的 Apps 脚本项目链接到已启用 API 的新创建的 GCP 项目。

    您现在可以安全地关闭此模式。

    根据transfers.insert method 上的文档:

    插入数据传输请求。

    HTTP 请求

    POST https://admin.googleapis.com/admin/datatransfer/v1/transfers

    请求正文

    请求正文包含DataTransfer 的实例。

    代码:

    首先,作为快速代码修复,applicationDataTransfers/applicationTransferParams/value 必须是 array of strings,因此应该是:

    "applicationId": XXXXX,
      "applicationTransferParams": [
        {
          "key": "RELEASE_RESOURCES",
          "value": [
            "TRUE"
          ]
        }
      ],
    // ...
    

    除此之外,oldOwnerUserIdnewOwnerUserId 值必须是从 users.list 端点获取的用户 ID 值。 Google 电子邮件地址无法替代。完整的示例请求如下:

    var payload = {
      "kind": "admin#datatransfer#DataTransfer",
      "oldOwnerUserId": "113412843513541354193",
      "newOwnerUserId": "118387348413214353832",
      "applicationDataTransfers": [
        {
          "applicationId": "14186345432",
          "applicationTransferParams": [
            {
              "key": "PRIVACY_LEVEL",
              "value": [
                "PRIVATE",
                "SHARED"
              ]
            }
          ]
        },
        {
          "applicationId": "546343454353",
          "applicationTransferParams": [
            {
              "key": "RELEASE_RESOURCES",
              "value": [
                "TRUE"
              ]
            }
          ]
        }
      ]
    }
    

    至于提出HTTP请求:

    const url = "https://admin.googleapis.com/admin/datatransfer/v1/transfers"; 
      
    var headers ={
      "Authorization": 'Bearer ' + ScriptApp.getOAuthToken(),
    };
        
    var options = {
      "method": "POST",
      "headers": headers,
      "contentType": "application/json",
      "payload": JSON.stringify(payload)
    };    
    

    重要提示:由于您将 API 直接使用脚本的令牌作为 OAuth 令牌,因此您需要使用所需的范围更新 Apps 脚本清单。

    按照View &gt; Show manifest file 菜单项,将您的范围添加到项目中。完整的清单文件应如下所示:

    {
      "timeZone": "Europe/Paris",
      "dependencies": {
      },
      "exceptionLogging": "STACKDRIVER",
      "runtimeVersion": "V8",
      "oauthScopes": [
        "https://www.googleapis.com/auth/script.external_request",
        "https://www.googleapis.com/auth/admin.datatransfer"
      ]
    }
    

    script.external_request 是必需的,因此您可以调用 UrlFetchAppadmin.datatransfer 是调用目录插入端点所需的范围。

    参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多