前提・実現したいこと
スプレッドシートにimage関数で入れた画像をpdfに反映したいです。
画像は条件分岐させて記入するので、image関数を使っています。
以前も同じ質問をして、その時はSpreadsheetApp.flush();を使って更新することでできるようになりました。
発生している問題・エラーメッセージ
しかし数日経って、突然全ての関数部分の画像が表示されなくなりました。
たまにランダムに1つだけ表示されたりします。ちなみにスプレッドシート上では全て問題なく表示されており、pdfになるとそれが消えている状態です。
動作の速度やタイミングの問題ではなく、pdfにする際に関数が画像になるかどうかそのものにランダム性が含まれているように感じます。
該当のソースコード
GAS
1function bill() { 2 //予約を書き出すシート 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheet= ss.getSheetByName('ご予約'); 5 var sheet1 = ss.getSheetByName('伝票') 6 var rows = sheet.getLastRow(); 7 var columns = sheet.getLastColumn(); 8 var range = sheet.getRange(1,1,rows,columns); 9 var values = range.getValues(); 10 var key = ss.getId(); 11//pdfにするのに必要なオーソライゼーション 12var token = ScriptApp.getOAuthToken(); 13 14 15 //それぞれのデータが存在するセル 16for(var i = 0; i < values.length; i++){ 17var name = values[i][1]; 18var date = values[i][2]; 19var payment = values[i][3]; 20var coupon = values[i][4]; 21var course = values[i][5]; 22var booking = values[i][6]; 23var language = values[i][7]; 24var table = values[i][8]; 25var coupon2 = values[i][9]; 26 27//もしチェックがついてなかったら、伝票を作ってね 28var check = values[i][0]; 29if(check == false){ 30 31 32// 貼り付ける画像のGoogleドライブID 33if(booking === '予約媒体: **' && course !== 'コース: 2時間'){ 34var x = '1Wumuy-Oo9QGg8H9bIXczmsBDn3M48z95'; 35var y = '1NyPm6se2uEnolBD4RLNHg7vncKuYL8Jr'; 36var z = '1ks0i_YQrs4lEJbyL1L5KhAuXMxtCwsdJ'; 37var z_name = '学校' 38var p = ''; 39var q = ''; 40}else if(booking === '予約媒体: **' && payment === '支払い方法: 現地払い'){ 41var x = '1Wumuy-Oo9QGg8H9bIXczmsBDn3M48z95'; 42var y = '1NyPm6se2uEnolBD4RLNHg7vncKuYL8Jr'; 43var z = ''; 44var p = '1rxDhi-7r_Y83rQ0Kg6I_2w6JW0dP3_xF'; 45var q = ''; 46 }else if(booking === '予約媒体: **' && payment !== '支払い方法: 現地払い'){ 47 var x = ''; 48 var y = ''; 49 var z = ''; 50 var p = ''; 51 var q = ''; 52}else if(booking === '予約媒体: **' && payment === '支払い方法: 現地払い'){ 53 var x = '1Wumuy-Oo9QGg8H9bIXczmsBDn3M48z95'; 54 var y = '1NyPm6se2uEnolBD4RLNHg7vncKuYL8Jr'; 55 var z = ''; 56 var p = '1rug02SrA2Wfl2DAcds6UJ4bpyOW0uLWL'; 57 var q = '1VJYSxXg7S77KA58qHBbIvXRWm_8Q7b36'; 58 }else if(booking === '予約媒体: **' && payment !== '支払い方法: 現地払い'){ 59 var x = ''; 60 var y = ''; 61 var z = ''; 62 var p = '1rug02SrA2Wfl2DAcds6UJ4bpyOW0uLWL'; 63 var q = '1VJYSxXg7S77KA58qHBbIvXRWm_8Q7b36'; 64}else if(booking === '予約媒体: **'){ 65 var x = ''; 66 var y = ''; 67 var z = ''; 68 var p = ''; 69 var q = ''; 70}else if(booking === '予約媒体: **'){ 71 var x = ''; 72 var y = ''; 73 var z = ''; 74 var p = ''; 75 var q = ''; 76}else if(course === 'コース: 2時間'){ 77 var x = '1J8w0zcCEEgMdD6kHOPZlNZGEqtGcGp8q'; 78 var y = '1rwMTR184dg9qHC9D0Lt0_ePMNvhekzoN'; 79 var z = ''; 80 var p = ''; 81 var q = ''; 82} 83 84// 貼り付ける行 85var row_x = 3; 86var row_y = 3; 87var row_z = 3; 88var row_p = 3; 89var row_q = 3; 90// 貼り付ける列 91var column_x = 1; 92var column_y = 2; 93var column_z = 3; 94var column_p = 7; 95var column_q = 8; 96 97 98// ドライブ画像への直リンク取得用URL 99var link_url = "http://drive.google.com/uc?export=view&id="; 100 101//---------------------------------------------------------- 102// 指定された画像を貼り付ける 103//---------------------------------------------------------- 104 105 // Googleドライブ内画像への直リンクURL 106 var url_x = link_url + x; 107 var url_y = link_url + y; 108 var url_z = link_url + z; 109 var url_p = link_url + p; 110 var url_q = link_url + q; 111 112 // スプレッドシートのIMAGE関数を使う 113 sheet1.getRange(row_x, column_x).setValue('=IMAGE("' + url_x + '")'); 114 sheet1.getRange(row_y, column_y).setValue('=IMAGE("' + url_y + '")'); 115 sheet1.getRange(row_z, column_z).setValue('=IMAGE("' + url_z + '")'); 116 sheet1.getRange(row_p, column_p).setValue('=IMAGE("' + url_p + '")'); 117 sheet1.getRange(row_q, column_q).setValue('=IMAGE("' + url_q + '")'); 118 119 120//伝票位置決め 121var billsheet = ss.getSheetByName('伝票'); 122var billsheetid = billsheet.getSheetId(); 123var billrows = billsheet.getLastRow(); 124var billcolumns = billsheet.getLastColumn(); 125var billrange = billsheet.getRange(1,1,billrows,billcolumns); 126var nameplace = billsheet.getRange('A1'); 127var dateplace = billsheet.getRange('E1'); 128var paymentplace = billsheet.getRange('H2') 129var bookingplace = billsheet.getRange('H1'); 130var tableplace = billsheet.getRange('J1'); 131var couponplace = billsheet.getRange('I3') 132var couponplace2 = billsheet.getRange('I4') 133var schoolplace = billsheet.getRange('C5'); 134 135 136//情報記入 137nameplace.setValue(name); 138dateplace.setValue(date); 139bookingplace.setValue(booking); 140paymentplace.setValue(payment); 141tableplace.setValue(table); 142couponplace.setValue(coupon); 143couponplace2.setValue(coupon2); 144schoolplace.setValue(z_name); 145 146// シートの再描画,これで書き込み遅延を解消できるはず 147SpreadsheetApp.flush(); 148SpreadsheetApp.flush(); 149Utilities.sleep(1000); 150 151//pdf作成 152var url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + billsheetid + "&format=pdf&portrait=false&size=A5&gridlines=false&fitw=true&pagenumber=false&top_margin=0.15&bottom_margin=0.00&left_margin=0.15&right_margin=0.15"; 153var pdf = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' + token}}).getBlob().setName("伝票"+".pdf"); 154 155//pdf保存 156 var folder = DriveApp.getFolderById("1k1bXln-8wFDsDoqrEKWtWiToS36f5TGm"); 157 var file = folder.createFile(pdf); 158}else{ 159 continue; 160 } //check if done 161}//for終了 162}//終了 163 164
試したこと
Utilities.sleep(1000);を使って少し動作を遅らせてみましたが、スプレッドシート上の動作を見ていると反映は一瞬でされているのでそういうことではないようです。
また別のシートにimage関数で入れておいた画像をsetformulaで入れ直してみても同じことでした。
よろしくお願いします。
あなたの回答
tips
プレビュー