ユーザーがスプレッドシートからデータを自動的に取得して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()
です。
問題は、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]
コメントを追加