🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

13271閲覧

GAS:処理が順番どおりに行かない

CoAT.Yuki

総合スコア12

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2019/11/01 06:58

編集2019/11/01 09:41

前提・実現したいこと

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へ順番をしっかり伝えられる方法を、どなたかご存知の方がいらっしゃいましたら、
是非ご教授お願いいたします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

何となくで申し訳ありませんが、setValue後の書類作成が速すぎるかもしれません。

Utilities.sleep(5000);
を挟んで数秒待機するのも一つの手かもしれません。

投稿2019/11/01 07:51

takaD

総合スコア315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CoAT.Yuki

2019/11/01 09:47

ご回答ありがとうございました。 お教わりしたことを試してみます!
guest

0

ベストアンサー

スクリプト全体が不明なため、この提案が直接の解決方法かどうかは分かりませんが、問題の原因は、スプレッドシートへ値を書き込んだ後に保存されていないのではないかと推測しました。そこで、J_export()の関数内にあるスクリプトを次のように変更してみてください。

From

javascript

1docSid.setValue(sid);

To:

javascript

1docSid.setValue(sid); 2SpreadsheetApp.flush(); // <--- これを追加

注意

  • 関数J_PDF_FIN()の中身が不明なため、すでにその関数内でSpreadsheetApp.flush()を使用されている場合は、他に問題がある可能性を考えます。

参考

投稿2019/11/01 07:46

kisojin

総合スコア899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CoAT.Yuki

2019/11/01 09:49 編集

ご回答ありがとうございます。 flush(); を試したところ、うまく処理ができました! 処理が早すぎるのは良いことなのですが、こんな落とし穴があるとは。。。 ありがとうございました!
kisojin

2019/11/02 23:32

問題が解決したとのことで安心しました。ご連絡ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問