1

以下で説明するアクションを実行するスクリプトの作成に取り組んでいます。これまでのところ、最初の 2 つの部分を機能させることができました。いくつかの応答フォーラムを確認し、提案を試みましたが、成功しませんでした。

必要なスクリプト フロー: スプレッドシート フォームから送信されたフォームは、フィールドに入力します: タイムスタンプ ユーザー名 (送信時に収集された電子メール) 学生の成績介入計画 コア リーディング/数学チーム (電子メール リスト)

1 スクリプトは onFormSubmit を実行し、テンプレート ドキュメントのコピーを作成し、その新しいコピーの名前をフォームで送信された e.value "student" に変更します。

2 次に、ドキュメント内の選択されたテキスト文字列を、フォームで送信された値に置き換えます。

3 編集者を新しいドキュメントに追加し、必要な指示を含む通知を送信します

4 イベントを作成します (提出日から 1 週間)。イベントの詳細には、チーム メンバーが入力を完了するための指示と共有ドキュメントへのリンクが含まれます。イベントの招待状をメーリング リストに送信します。

これまでの作業スクリプトは次のとおりです。

function formSubmitValues(e) {

  var timeStamp = e.values[0];
  var userEmail = e.values[1];
  var student = e.values[2];
  var grade = e.values[3];
  var conern = e.values[4];
  var readingCore = e.values[5];
  var mathCore = e.values[6];
  var interventions = e.values[7];
  var team = e.values[8].toString(); // "just to be sure"..Henrique says add .toString      this allowed the replaceText part to work

  //Makes copy of template document and renames
  var tempID = ("1Rq0pDAnuGNfL6W3GB0ZuLeWM2uYzHpKzoyxoXlwjtgE") // use document ID from Template Document
  var copyId = DocsList
              .getFileById(tempID)
              .makeCopy(student + " Initial Referral") // names new copy as student's name
              .getId();

// trying to add editors to new document using email list generated in form submit value of "team"
DocsList.getFileById(copyId).addEditors([team]); 




// replaces text within template with selected fields from formSubmitValues
  var doc = DocumentApp.openById(copyId)  
  var body = doc.getActiveSection();

    body.replaceText("%STUDENT%", student);
    body.replaceText("%DATE%", timeStamp);
    body.replaceText("%TEACHER%", userEmail);
    body.replaceText("%TEAM%", team);

  return doc;

}

報告された問題の回答: 彼らの発言は次のとおりです: 「この関数は次のような配列または文字列を取ります:DocsList.getFileById(copyId).addEditors(['parent@domain.com', 'parent2@domain.com']);

このようなスクリプトにメールを直接入力してみましたが、うまくいきました。したがって、私の問題は 'addEditorsメソッドではなく、フォームから送信された電子メールを正しく渡すことにあります。これを行う方法について何か提案はありますか?

.toString() を使用するかどうか、および .Split(',') を使用するすべての組み合わせであると思われるものを試しました。

RE-DEFINE PROBLEM :したがって、e.values フォームの送信から電子メールがどのように渡されるかの問題です。

ここに私がいるところです: メールをスクリプトに直接入力すると:うまくいきます (スクリプト内のメソッドを最後ではなく 直後に.addEditors(['parent@domain.com', 'email2@domain.net', 'email3@gmail.com'])移動する必要がありました)。そして残りのスクリプトを実行します。注: 理解できない部分の 1 つは、一重引用符、つまり 'email' です。これらはスクリプトに入力する必要がありますが、実行時に Transcript に表示されません。フォーム内の電子メールの周りに配置しようとしましたが、Transcript に表示され、とにかく実行されません。addEditors.makeCopyFile.addEditors([[parent@domain.com, email2@domain.net]])

スクリプトは次のようになります。

var tempID = ("1Rq0pDAnuGNfL6W3GB0ZuLeWM2uYzHpKzoyxoXlwjtgE") // use document ID from Template Document
var copyId = DocsList
              .getFileById(tempID)
              .makeCopy(student + " - TestingCopy") // names new copy as student's name + text
              .addEditors([team.split(',')])  
              .getId();

しかし、var teamwith または withoutを使用すると、.split(',')機能しません。しかし、Transcript では次のように表示 されます。File.addEditors([[rreynolds@domain.net, parent@domain.com]]) これは、機能する場合と同じように見えますが、Transcript で最後に表示されるものであり、エディターはドキュメントに追加されず、スクリプトは終了しません。

私は明らかにここで何かを理解していません。addEditors メソッドが必要とする方法で、チーム e.values 内の電子メールを処理する方法はありますか? スプレッドシートのセルでは、CSV として表示されます。つまり、rreynolds@domain.net、parent@domain.com などです。一度に 1 つずつ読み取る必要がありますか。

私は多くのことを学んでおり、皆さんの助けに感謝しています。すべてのコメントで混乱して申し訳ありませんが、このフォーラムの問題に対処する正しい方法がわかりません. たとえば、元のスクリプトに戻って編集して現在のバージョンを表示するか、別の場所に追加する必要がありますか? 他の人が簡単にフォローできるように、会話の流れを維持しようとしています-ありがとうロブ

4

3 に答える 3

0

最後に (できれば) 明確な回答をさせてください : (スプレッドシートを共有してくれてありがとう、これは作業がはるかに簡単です ;-)

ここにあなたのコードが完全に機能しています。

それがどのように機能するかを示すために、いくつかの中間変数を作成しました。

    function formSubmitEditors(e) {

      // defines spreadsheet form events on submit of form.  This function formSubmitEditors is triggered on formSubmit
      var timeStamp = e.values[0];
      var fileName = e.values[1];
      var team = e.values[2].replace(/, /g,"|"); // remove unwanted spaces and commas replace by | for visibility ;-)
      Logger.log(team);// contains | as separators
      var teamArray = team.split('|');
      Logger.log(teamArray.length+'  :  '+teamArray);// check that it is an array of x elements

      //Makes copy of template document and renames
      var tempID = '1Rq0pDAnuGNfL6W3GB0ZuLeWM2uYzHpKzoyxoXlwjtgE' // use document ID from Template Document
      var copyId = DocsList
                  .getFileById(tempID)
                  .makeCopy(fileName + " - TestingCopy") // names new copy as student's name + text
                  .getId();                     // 
    var file = DocsList.getFileById(copyId).addEditors(teamArray);

    // replaces merged-text values within template with selected fields from formSubmitValues
      var doc = DocumentApp.openById(copyId)
      var body = doc.getActiveSection();

        body.replaceText("%FILE%", fileName);// you wrote %FILENAME% in place of %FILE%
        body.replaceText("%DATE%", timeStamp);
        body.replaceText("%TEAM%", team);// it will be shown with | as separators, if you don't like it replace team by teamArray.toString() to get commas again.
     }

編集: e.parameters は既に文字列であるため、チームイベントの toString() を削除しました。

EDIT2 : 最初の質問で必要なことを完了して実行するには、コードの末尾を、来週の Cal イベントを作成し、ドキュメントへのリンクを含む招待状を送信するコードに置き換えることができます。

  var file = DocsList.getFileById(copyId).addEditors(editorsArray);
  var fileurl = file.getUrl();
  Logger.log(fileurl)

// replaces merged-text values within template with selected fields from formSubmitValues
  var doc = DocumentApp.openById(copyId)
  var body = doc.getActiveSection();

    body.replaceText("%FILE%", fileName);
    body.replaceText("%DATE%", timeStamp);
    body.replaceText("%MAILS%", editors);

  var Cal = CalendarApp.getCalendarsByName('testencodage')[0];// replace with your calendar name you want to use
  var newEvent = Cal.createAllDayEvent('Fill the questionnary', new Date(new Date(newtimeStamp).getTime()+7*24*3600*1000), { guests : e.values[2] , sendInvites : true , description :"Don't forget to fill this document "+fileurl})
 }
于 2012-07-05T16:16:58.460 に答える
0

私はいくつかのことをお勧めします

  1. コードにいくつかの Logger.log ステートメントを追加して、デバッグ情報を出力します。
  2. コードのセクション全体に try ... catch ブロックを追加し、例外を出力します。例外が発生しているかどうかを確認してください。

最後に、[実行トランスクリプト] ウィンドウを使用して、スクリプトが停止した場所を確認します (停止した場合)。

于 2012-07-02T04:42:51.150 に答える
0

電子メールで編集者を追加するには、次の 2 つの方法がありますaddEditors([emailAddresses])addEditor(emailAddress)

1 つ目は "s" を含み、電子メール アドレス文字列の配列を必要とし、2 つ目は単一の文字列を引数として取ります。2 番目を使用するか、コード内の電子メール文字列に [括弧] を追加する必要があります。

あなたのコメントについて// 場所/方法を理解する必要があります: .addEditors(email1,email2,etc); // これは DocsList または DocumentApp クラスから行われますか?

addEditor()ドキュメントで説明されているように、ファイルクラス、DocsListクラスのメンバーに属している場合、ユーザーオブジェクトまたはユーザーメールを使用してユーザーaddEditors()追加できます。このように使用できますDocFile.addEditors([email1,email2])

編集 :この投稿に多くのコメントがあり、申し訳ありませんが、非常に読みにくくなっています...これらの addEditors 機能をスプレッドシートでテストしたところ、複数のユーザーの電子メールには単純な配列を使用し、単一の電子メールには文字列を使用して、期待どおりに動作しました。document serviceメソッドに問題があるようで、addEditor()Issue Tracker に報告する必要があります。

REPORTED問題 #1512 - Rocketrobを報告しました

于 2012-07-02T08:34:28.260 に答える