ユーザー入力を取得して行番号を見つけ、その行のすべてのデータをドキュメントテンプレートに適用するにはどうすればよいですか?

Ciaran Crowley

ユーザーがスプレッドシートからデータを自動的に取得してGoogleドキュメントテンプレートに適用できるようにするスクリプトに取り組んでいます。

私のcreateTemplate()関数は、シートの各行を個別に取得し、それをドキュメントテンプレートに適用します。この関数は、アクティブなシートの各行に対してこれを実行します。

chooseRow()ユーザーがtagNoを検索できるようにする別の関数があります。プロンプトを介して。
tagNo。スプレッドシートに保存されているマシンの一意の識別子です。

各マシンには独自のtagNoがあり、ユーザーは常にtagNoを知っています。

この関数は行番号をログに記録していますが、createTemplate()実際にドキュメントを作成する関数と同じコードを適用することはできません

からのコードを適用して、探している結果が得られるcreateTemplate()ことchooseRow()を願っていますが、とまったく同じように終了しましたcreateTemplate()

で使用されているforループの内側にコードを適用しましたchooseRow()

function chooseRow(){
  var ui = SpreadsheetApp.getUi(); // Same variations.
  var result = ui.prompt('Please enter the Tag number of the row you wish to print.', ui.ButtonSet.OK_CANCEL);

  // Process the user's response.
  var button = result.getSelectedButton();
  var response = result.getResponseText();
  if (button == ui.Button.OK) {
    // User clicked "OK".
    ui.alert('Your name is ' + response + '.');
  } else if (button == ui.Button.CLOSE) {
    // User clicked X in the title bar.
    ui.alert('You closed the dialog.');
  }

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();

  for(var i = 0; i < values.length; i++){
    for(var j = 0; j < values[i].length; j++){
      if(values[i][j] == response){
        Logger.log(i);
      }
    }
  }
}
function createTemplate(){
  var sleepInt = 0;
  var templateId = "1uSAcH8F21zEjuprIcE2_d84ojQT24ek85Y1W6L17Xno"; //Template ID (Taken from address bar)
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  ss.toast("starting");
  Utilities.sleep(sleepInt);

  var sheet = ss.getActiveSheet();
  //starting with row 2 and column 1 as our upper-left most column, get values from cells from 1 row down, and 15 columns along - hence (2,1,1,15)
  var data = sheet.getRange(2, 2, 11, 18).getValues(); 

  ss.toast("created document and adding data");
  Utilities.sleep(sleepInt);

  //Get the title and tag number columns ready.  Also get todays date
  //Keeping this block above the for loop allows the code to run faster as it doesn't have to do a .getRange or recalculate the date every time the loop iterates
  var docTitle = sheet.getRange(2, 2, 11, 1).getValues();//this is grabbing the data in field B2
  var docTitleTagNumber = sheet.getRange(2, 3, 11, 1).getValues();
  var today = new Date();
  var dd = today.getDate();
  var mm = today.getMonth() + 1;
  var yyyy = today.getFullYear();
  today = dd + '/' + mm + '/' + yyyy;

  //apply data to template
  for(var i in data){
    var row = data[i];
    var docId = DriveApp.getFileById(templateId).makeCopy().getId();
    var doc = DocumentApp.openById(docId);
    var body = doc.getActiveSection();
    body.replaceText("%SITEID%", row[0]);
    body.replaceText("%TAG%", row[1]);
    body.replaceText("%CATEGORY%", row[2]);
    body.replaceText("%DESCRIPTION%", row[3]);
    body.replaceText("%AREA%", row[4]);
    body.replaceText("%SERIALNO%", row[5]);
    body.replaceText("%MODEL%", row[6]);
    body.replaceText("%MANUAL%", row[7]);
    body.replaceText("%HOOKUP%", row[8]);
    body.replaceText("%WEB%", row[9]); 
    body.replaceText("%CONNECTED%", row[11]);
    body.replaceText("%CALIBRATED%", row[12]);
    body.replaceText("%AUTOMATED%", row[13]);
    body.replaceText("%SAT%", row[14]);
    body.replaceText("%SIGNED%", row[16]);

    doc.saveAndClose();

    ss.toast("added data");
    Utilities.sleep(sleepInt);

    //Copy the modified template into the specific folder, then delete the first copy we made (to modify it)
    var file = DriveApp.getFileById(doc.getId());
    var newFolder = DriveApp.getFolderById("16wRGBVdV0OZ5YfKhqEQSFMsux-ekGCCa");
    newFolder.addFile(file); 

    ss.toast("finished");
    Utilities.sleep(sleepInt);

    //uses i to iterate through each row in the first column
    var newDocTitle = docTitle[i][0];
    var newDocTagNumber = docTitleTagNumber[i][0];

    //apply document names, tag numbers, and dates
    doc.setName(newDocTitle + " " + newDocTagNumber + " " + today);
  }
}

期待される出力は、tagNoを含む行のすべてのデータを含む1つのドキュメントです。ユーザーがプロンプトに入力したが、私が得ている結果はと同じcreateTemplate()です。

Ciaran Crowley

問題は、forループ全体を取り込んで、createTemplate()のifステートメント内に適用していたことchooseRow()です。これは、で次のコードを使用することで解決できますcreatetemplate()

    var row = data[i];
    var docId = DriveApp.getFileById(templateId).makeCopy().getId();
    var doc = DocumentApp.openById(docId);
    var body = doc.getActiveSection();
    body.replaceText("%SITEID%", row[0]);
    body.replaceText("%TAG%", row[1]);
    body.replaceText("%CATEGORY%", row[2]);
    body.replaceText("%DESCRIPTION%", row[3]);
    ...

    body.replaceText("%AUTOMATED%", row[13]);
    body.replaceText("%SAT%", row[14]);
    body.replaceText("%SIGNED%", row[16]);

    doc.saveAndClose();

    ss.toast("added data");
    Utilities.sleep(sleepInt);

    //Copy the modified template into the specific folder, then delete the first copy we made (to modify it)
    var file = DriveApp.getFileById(doc.getId());
    var newFolder = DriveApp.getFolderById("16wRGBVdV0OZ5YfKhqEQSFMsux-ekGCCa");
    newFolder.addFile(file); 

    ss.toast("finished");
    Utilities.sleep(sleepInt);

    //uses i to iterate through each row in the first column
    var newDocTitle = docTitle[i][0];
    var newDocTagNumber = docTitleTagNumber[i][0];

    //apply document names, tag numbers, and dates
    doc.setName(newDocTitle + " " + newDocTagNumber + " " + today);

適切な変数と一緒に、下のifステートメントに貼り付けます Logger.log(i);

for(var i = 0; i < values.length; i++){
    for(var j = 0; j < values[i].length; j++){
      if(values[i][j] == response){
        Logger.log(i);
      }
    }
  }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ