-1

私はGoogleのスクリプトシーンに少し慣れていません。私はこれを何度も繰り返しましたが、適切にインクリメントすることに頭を悩ませることはできません。

フォームを使用するGoogleスプレッドシートを作成しました。誰かがフォームを使用して機器を送信すると、電子メール送信機能(MailApp.sendEmail)を使用して経理担当者に電子メールで送信します。

これまでのところ、spreadhsheetに完全に入力できますが、関数を実行すると、最初の行の「status」変数にラベルが付けられるだけで、リストを続行せず、その1行に数回電子メールを送信します。誰かが私がこれでとても間違っているところを見ることができますか?

利用可能な次の行にデータを送信するためにこれが必要です。次に、スクリプトはEMAIL_SENTの最後のセルをチェックし、その値がない場合は、電子メールを送信してから次のデータ行をチェックする必要があります。同様に(スプレッドシート内から手動でスクリプトを実行する必要がある場合)。ここでは、インクリメントとループで何が間違っているのかを理解できる同様の質問を見つけることができませんでした。

スクリプトは次のとおりです。

function sendThisOut() {
  // set the current spreadsheet and active sheet
  var sheet = SpreadsheetApp.getActiveSheet();

  // set range data
  var sRow = 2;  // first top left cell of data
  var cols = 9; // Num of cols 

  // define initial data source and get values
  var dataRange = sheet.getRange(sRow,1,1,cols);
  var data = dataRange.getValues();

  // increment data
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];

    // define each column
    var tstamp = row[0]; // get timestamp (col A)
    var acct = row[1]; // define account (col B)
    var cname = row[2]; // define client name (col C)
    var comment = row[3]; // define comments (col D)
    var item1 = row[4]; // defines item 1 (col E)
    var item2 = row[5]; // defines item 2 (col F)
    var item3 = row[6]; // defines item 3 (col G)
    var item4 = row[7]; // defines item 4 (col H)
    var status = row[8]; // get status (emailed or no?)

    // setup e-mail vars
    var emailAddr = "myEmail@myDomain.com";
    var subject = "ACCT:" + acct + " " + cname + " - Equipment Request";

    // setup content of e-mail
    var body = "Hello Accounting,\n\n" +
        "Please bill for the contained items on the following account:\n\n" +
        "Account: " + acct + "\n\n" +
        "Client Name: " + cname + "\n\n" +
        "Item 1: " + item1 + "\n\n" +
        "Item 2: " + item2 + "\n\n" +
        "Item 3: " + item3 + "\n\n" +
        "Item 4: " + item4 + "\n\n" +
        "Reason for rekey: " + comment;

    // check status and if it doesn't have EMAIL_SENT, email it
    if (status != "EMAIL_SENT") {
      MailApp.sendEmail(emailAddr, subject, body);
      // Make sure the cell is updated right away in case the script is interrupted
      sheet.getRange(sRow + i, 9).setValue(EMAIL_SENT);
      SpreadsheetApp.flush();
    };

  };
}

御時間ありがとうございます!

4

3 に答える 3

1

私が見ている

 sheet.getRange(sRow + i, 9).setValue(EMAIL_SENT);

これはすべきではありません(二重引用符を参照してください)

  sheet.getRange(sRow + i, 9).setValue("EMAIL_SENT");
于 2012-05-29T05:26:29.927 に答える
1

1行目の「status」変数にラベルを付けるだけで、リストを続行しません。

最初の行にのみ影響を与える理由は、次の3番目の引数です。

var dataRange = sheet.getRange(sRow、1、1 cols);

これは、データセットの行数を指定する必要があります。ご覧のとおり、1(1)であるため、dataRangeの行は1つだけになります。次のことを試して、それが役立つかどうかを確認してください。

// set range data
  var sRow = 2;  // first top left cell of data
  var cols = 9; // Num of cols 
  var rows = sheet.getLastRow() - sRow + 1
  // define initial data source and get values
  var dataRange = sheet.getRange(sRow,1,rows,cols);
  var data = dataRange.getValues();

次に、その1行を数回電子メールで送信します。

テスト中に複数のトリガーを設定した可能性がない限り、これについてはよくわかりませんか?上記の変更後に試してみて、それでも問題が解決しない場合は投稿してください。

于 2012-05-29T15:55:36.043 に答える
0

それで、上で述べたように、私はこれを何度も繰り返し続けなければなりませんでした。最後に、別の手法を学び、いくつかの分散スレッドを見つけることで、次のスクリプトを作成しました。-送信時にデータの最後の行をチェックするだけです-ユーザーにフォームを送信させます-対象者にメールを送信します-スプレッドシートを更新します-休憩を監視します-電子メール/休憩の確認を提供します

これが他の誰かに役立つことを願っています。これまでのところ、スプレッドシート全体をスキャンするスクリプトを作成していますが、このスクリプトは、フォームの送信時に最後の行をチェックし、特定の質問に答えます。フルシートスキャンに対する回答が見つかったら、回答を投稿しようと思います。

(追記:これをGoogle Scripterに貼り付ける方がスムーズかもしれません。自分自身と、これを読んでいる人が何が起こっているかを追跡できるように、たくさんのコメントを追加しました)

function other() {
  // set the current sheet
  var sheet = SpreadsheetApp.getActiveSheet();

  // set the last row and column
  var lrow = sheet.getLastRow();
  var lcol = sheet.getLastColumn();

  // set the major row range and data values
  var rowRng = sheet.getRange(lrow, 1, 1, lcol);
  var rowData = rowRng.getValues()[0];

  // setup redundancy checks for status and email
  // data status, email status and submitter are added to column headers AFTER form creation
  var statrng = sheet.getRange(lrow, 8); // set range of status
  var stat = statrng.getValue(); // get value of status in col h
  var emsrng = sheet.getRange(lrow, 9); // set range of emailed status
  var ems = emsrng.getValue(); // get value of emailed status in col i

  // get current submitters data and set ranges for it, then apply data to sheet
  var suberng = sheet.getRange(lrow, 10); // set range of submitters email
  var sube = Session.getActiveUser().getEmail(); // get submitters email
  suberng.setValue(sube); // set subs email to sheet in col j

  // setup the per cell data
  var tstamp = rowData[0]; // col a: set timestamp (created when forms created)
  var cname = rowData[1]; // col b: set the client name
  var acct = rowData[2]; // col c: set the account number cell
  var it1 = rowData[3]; // col d: set item 1
  var it2 = rowData[4]; // col e: set item 2
  var it3 = rowData[5]; // col f: set item 3
  var it4 = rowData[6]; // col g: set item 4

  // setup email vars
  var em = "myEmail@myDomain.com"; // email that data needs to go too
  var sub = "ACCT: " +acct+ " - " +cname+ "Request"; // subject in email
  var body = "Hello Accounting,\n\n"
      + "Please order the following:\n\n"
      + "Item 1: " +it1
      + "\nItem 2: " +it2
      + "\nItem 3: " +it3
      + "\nItem 4: " +it4
      + "\n\nPlease send us the invoicing once complete."
      + "\n\nSubmitted by\n"
      + sube + " : " + tstamp;

  // Now that all variables have been set, run checks and send the email as well
  // as a confirmation email. If script doesn't complete, a failure notice is sent if possible

  // as long as there's a timestamp and submitted status is empty, run if statement
  if (tstamp !== "" && stat == "") {
    statrng.setValue("Submitted"); // update status field since we've gotten this far
    var statu = statrng.getValue(); // make sure update took for status
    if (statu == "Submitted") {
      if (ems == "") { // no need to continue if email has already been sent, so check
        MailApp.sendEmail(em, sub, body); // send to accounting people
        emsrng.setValue("Emailed"); // update status that email was successfully sent
        // let submitter know it was a success
        MailApp.sendEmail(sube,"ACCT: " +acct+ " - Submission Successful","Your Submission was Successful!");
      }
    } else {
      // if form failed, let submitter know it was not a success
      MailApp.sendEmail(sube,"ACCT: " +acct+ " - Submission Successful","Your Submission was Successful!");
    }
  }
}
于 2012-06-02T19:07:41.163 に答える