1

StackOverflowとGoogleAppsScriptの新機能です。私はどんな援助/ガイダンスにも感謝します。

タスク:

指定したフォルダ内のすべてのファイルの所有権を1人の所有者に譲渡するGoogleAppsScriptを作成しようとしています。私はGoogleAppsPremierEditionアカウントのスーパー管理者です。ただし、私は元の所有者でも新しい所有者でもありません。また、セキュリティ上の理由から、新しい所有者をスーパー管理者にする(つまりスクリプトを実行する)ことはできません。元の所有者と新しい所有者の両方が同じドメインにいます。

次のコードを見つけました。これを使用して目的に合わせて調整しましたが、URLFetchApp呼び出しから「返されたコード400のリクエストに失敗しました。サーバーの応答:」エラーが発生します。

私がしたこと:

Google Apps Documents List開発者ガイドに従って、 「base」変数を変更して、新しいドキュメント所有者になりすました。

    var base = 'https://docs.google.com/feeds/';

    var base = encodeURIComponent('https://docs.google.com/feeds/'+newOwnerEmail+'/private/full');

また、googleOAuth_()メソッドでコンシューマキーとシークレットを正しい値に更新しました。これで、問題のある行に至るまでのコードのセクション全体を次に示します。

  file.removeEditor(newOwnerEmail);
  var base = encodeURIComponent('https://docs.google.com/feeds/'+newOwnerEmail+'/private/full');
  var fetchArgs = googleOAuth_('docs', base);
  fetchArgs.method = 'POST';
  var rawXml = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gAcl='http://schemas.google.com/acl/2007'>"
  +"<category scheme='http://schemas.google.com/g/2005#kind' "
  +"term='http://schemas.google.com/acl/2007#accessRule'/>"
  +"<gAcl:role value='owner'/>"
  +"<gAcl:scope type='user' value='"+newOwnerEmail+"'/>"
  +"</entry>";
  fetchArgs.payload = rawXml;
  fetchArgs.contentType = 'application/atom+xml';
  var url = base + encodeURIComponent(oldOwnerEmail + '/private/full/'+fileId+'/acl&alt=json');

  try { var content = UrlFetchApp.fetch(url, fetchArgs).getContentText(); }
  catch (err) { Logger.log(err.message) }

アプリケーションがUrlFetchApp.fetch()メソッドの実行を「試行」するたびに、アプリケーションは400エラーを「キャッチ」します。

質問:

ここで何が欠けているのでしょうか?「fetchArgs」は何らかの形で不正になっていますか(おそらく「fetchArgs」が供給されている「rawXML」)?新しいGoogleドライブSDKでは、このAPIを使用する方が良いオプションですか?見逃したかもしれないガイダンスやリソース、およびこれらの質問をする方法を改善するためのヒントをいただければ幸いです。前もって感謝します。

4

1 に答える 1

1

この問題を解決しました。

encodeURIComponent()メソッドを削除しました。これは明らかにURLには必要ありません。また、OAuthAppライブラリ(ここにあります)を使用して、URLFetchApp.fetch()メソッドのフェッチオプションの作成を開始しました。これらの修正の一方または両方で問題が解決したかどうかはわかりませんが、スクリプトは現在一貫して機能しているので、私は幸せです。

以下の完全な更新されたコード:

function changeOwner(newOwnerEmail, file)
{
  var fileId = file.getId();
  var oldOwnerEmail = file.getOwner().getEmail();

  if (oldOwnerEmail == newOwnerEmail) { return; }

  file.removeEditor(newOwnerEmail);  //should this be oldOwnerEmail?
  var base = 'https://docs.google.com/feeds/';

  var options = OAuthApp.getAuth('docs');

  options.method = 'POST';
  var rawXml = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gAcl='http://schemas.google.com/acl/2007'>"
      +"<category scheme='http://schemas.google.com/g/2005#kind' "
      +"term='http://schemas.google.com/acl/2007#accessRule'/>"
      +"<gAcl:role value='owner'/>"
      +"<gAcl:scope type='user' value='"+newOwnerEmail+"'/>"
      +"</entry>";
  options.payload = rawXml;
  options.contentType = 'application/atom+xml';

  var API_KEY = getAPIKey();  
  var url = base + oldOwnerEmail+'/private/full/'+fileId+'/acl?v=3&alt=json&key='+API_KEY

  try 
  { 
    var result = UrlFetchApp.fetch(url, options);
    docsObject  = Utilities.jsonParse(result.getContentText());
  }
  catch (err) { Logger.log(err.message) }

}//end changeOwner()
于 2013-01-08T17:27:53.203 に答える