前提・実現したいこと
Google Script と Google Sheetを使って、簡単な受注書発行システムを、下記の様な処理で作っています。
0. 顧客リストから「新規見積, 受注済」のステータスになっている顧客を検出
0. その顧客群から、「受注書済」にではない顧客を検出
0. その顧客の「商談ID (sid)」と格納先の「フォルダID (fid)」を取得
0. 同じGsheetファイル上にある他のシートに作成した受注書に「商談ID」を自動転記
0. 同じスクリプト上にある、書類を作成する別のファンクションに「商談ID」と「フォルダID」を渡す
0. 書類作成
発生している問題
今回問題になっているのが、上記のプロセスの4番に当たる、「商談IDの転記」の部分です。
なぜか、この4番が、6番の「書類を作成」した後に実行されます。
よって、連続してこのスクリプトを起動すると、受注書に転記される商談IDが一つづつ、ずれてしまいます。
例)
商談ID:0001 / 書類へ転記:空白、又は以前に入力されていた値
商談ID:0002 / 書類へ転記:0001
商談ID:0003 / 書類へ転記:0002
該当のソースコード
GAS
101 検出 2function testdetect (){ 3 var ssid = "1ti3KmfS6xY3Dk-3492D6no1FczdU90KSE_DIsqVu6zU";// スプレッドシートのID 4 var ss = SpreadsheetApp.openById(ssid);// 指定したスプレッドシートを開く 5 6 var formsheet = ss.getSheetByName('フォームの回答 1');//フォームデータがたまるシート 7 var fsDataRange = formsheet.getDataRange(); 8 var values = fsDataRange.getValues(); 9 var lastRow = fsDataRange.getLastRow(); 10 11 for(var i = lastRow-1; i>=1; i--){ 12 var status = values[i][20];//顧客のステータス 13 var docStatus = values[i][80];//書類作成ステータス:検出用 14 var docS = formsheet.getRange(i+1,81);//書類作成ステータス:自動入力用 15 var sid = values[i][2];//商談id 16 var fid = values[i][79];//フォルダid 17 18 switch(status){ 19 20 //受注済の顧客を検出 21 case "新規見積, 受注済": 22 if(docStatus != "受注書済"){ 23 24 //受注書作成済と記入 25 docS.setValue("受注書済"); 26 27 //受注書作成プロセス・スタート 28 J_export(sid,fid); 29 30 }else if(docStatus == "受注書済"){ 31 docS.setValue("受注書済"); 32 } 33 break; 34 default: 35 break; 36 } 37 } 38} 39 4002 書類セットアップ 41function J_export(sid,fid) 42{ 43 //受注書用 44 var ssid = "1ti3KmfS6xY3Dk-3492D6no1FczdU90KSE_DIsqVu6zU";// スプレッドシートのID 45 var ss = SpreadsheetApp.openById(ssid);// 指定したスプレッドシートを開く 46 47 var JSheetid = "1576291853"; // PDF化したいシートID(gid)を指定 48 var Fid = fid; // PDFの保存先となるフォルダID 49 50 var docJ = ss.getSheetByName('受注書');//受注書 51 var docDataRange = docJ.getDataRange(); 52 var docSid = docJ.getRange(4,22);//受注書:商談ID入力セル 53 54 /////////////////!!!!ここが書類出力前に受注書にIDを付与するところです!!!!/////////////// 55 //受注書にIDを付与 56 docSid.setValue(sid); 57 //////////////////////////////////////////////////////////////////////////////// 58 59 // ファイル名に使用する名前を取得 60 var filename = "J-"+sid+"_受注書"; 61 62 //ここで書類作成するファンクションに値を渡し、書類作成します。 63 J_PDF_FIN(Fid, ssid, JSheetid, filename); 64} 65 6603 書類作成 67function J_PDF_FIN(Fid, ssid, JSheetid, filename) 68{ 69 var ss = SpreadsheetApp.getActiveSpreadsheet(); 70 var folder = DriveApp.getFolderById(Fid);// PDFファイルの保存先となるフォルダをフォルダIDで指定 71 72// スプレッドシートをPDFにエクスポートするためのURL。このURLに色々なオプションを付けてPDFを作成 73 var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid); 74 75 // PDF作成のオプションを指定 76 var opts = { 77 exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 78 format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx 79 size: "A4", // 用紙サイズの指定 legal / letter / A4 80 portrait: "true", // true → 縦向き、false → 横向き 81 fitw: "true", // 幅を用紙に合わせるか 82 sheetnames: "false", // シート名をPDF上部に表示するか 83 printtitle: "false", // スプレッドシート名をPDF上部に表示するか 84 pagenumbers: "false", // ページ番号の有無 85 gridlines: "false", // グリッドラインの表示有無 86 fzr: "false", // 固定行の表示有無 87 gid: JSheetid // シートIDを指定 sheetidは引数で取得 88 }; 89 90 var url_ext = []; 91 92 // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 93 for( optName in opts ){ 94 url_ext.push( optName + "=" + opts[optName] ); 95 } 96 97 // url_extの各要素を「&」で繋げる 98 var options = url_ext.join("&"); 99 100 // API使用のためのOAuth認証 101 var token = ScriptApp.getOAuthToken(); 102 103 // PDF作成 104 var response = UrlFetchApp.fetch(url + options, { 105 headers: { 106 'Authorization': 'Bearer ' + token 107 } 108 }); 109 110 var blob = response.getBlob().setName(filename + '.pdf'); 111 112 // PDFを指定したフォルダに保存 113 folder.createFile(blob); 114}
試したこと
転記のタイミングが変わるかな?と思い、色々と書く場所を変えて見たのですが、
結局、書類が先に出力されてしまい、転記が後回しになってしまいます。。。
GASへ順番をしっかり伝えられる方法を、どなたかご存知の方がいらっしゃいましたら、
是非ご教授お願いいたします!
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/01 09:47