スプレッドシートに表示された画像をPDFに変換すると消えてしまう

実現したいこと

Googleフォームで画像を添付してもらったものをスプレッドシートにまとめ、それを別シートに画像を表示して、PDF⇨メール送信という流れにしたいと考えています。

実現したいのは、GASでPDFに変換したいことです。

発生している問題・分からないこと

GASを使ってフォームで取得した画像を別シートに表示まで出来ています。
手動だとそのページの印刷プレビューでは画像は残ったままで、PDF変換も可能です。
ところが、GASでPDFに変換しようとすると消えてしまいます。このサイトで過去のやり方を拝見し、実行してみたのですが画像が表示されません。

該当のソースコード

Google

1function form(e) {//フォームの回答を取得 2 var values = e.values;//フォームの回答を取得 3 //var stamp = values[0];//タイムスタンプを取得 4 var mail = values[1];//アドレス 5 var year = values[2];//年 6 var month = values[3];//月 7 var date = values[4];//日 8 var image = values[5];//画像 9 var birth = values[2]+values[3]+values[4]; 10 var ss = SpreadsheetApp.getActiveSpreadsheet();//スプレッドシートを有効にする 11 var fmsh = ss.getSheetByName("フォームの回答 1") 12 var fsht = ss.getSheetByName("シート"); 13 var lastrow = fmsh.getLastRow(); // 最終行を取得 14 var lastcol = fmsh.getLastColumn(); // 最終列を取得 15 16 //日付をシートのG1に反映 17 fsht.getRange("G1").setValue(birth); 18 19 20 //ファイルIDの取得。フォームで取得したURLを分割 21 //分割したURLと出力用のURLくっつけた情報がフォームシートのG列H列に表示 22 for (let i = 2; i <= fmsh.getLastRow(); i++) { 23 var url = fmsh.getRange(i, 6).getValue(); 24 var id = url.split('=')[1];//.split('/')[0]; 25 console.log(id); 26 var fid = "https://drive.google.com/"+"uc?export=view&id=" + id ; 27 fmsh.getRange(i, 7).setValue(id); //idだけ抽出 28 fmsh.getRange(i, 8).setValue(fid); //上のfidをくっつけたURL 29 var ana787 = fmsh.getRange(i ,7).getValue(); 30 var jal = fmsh.getRange(i, 8, lastrow); 31 32 } 33 34 //ファイルIDに追加 35 //console.log(jal); 36 //console.log(fid); 37 38 39 //フォームの回答のH1セルにファイルIDのURL最終行を表示する 40 var ana = fmsh.getRange(2,8,lastrow).getValue(); 41 //console.log(ana); 42 43 //画像をbase64形式に変換。PDF化した時に画像が消えることに対応 44 var fileId = ana787; 45 var blob = DriveApp.getFileById(fileId).getBlob(); 46 var contentType = blob.getContentType(); 47 var base64 = Utilities.base64Encode(blob.getBytes()); 48 var imageStr = "data:" + contentType + ";base64, " + base64; 49 50 var image = SpreadsheetApp.newCellImage() 51 .setSourceUrl(imageStr) 52 .setAltTextTitle("テスト") 53 .setAltTextDescription("テスト2") 54 .build(); 55 56 fsht.getRange("A6").setValue(image); 57 58 59 // フォームの回答のH1セルに最終行のfidを反映+削除(現実は、削除してから反映) 60 fmsh.getRange("H1").clearContent(); 61 fmsh.getRange("H1").setValue(fid); 62 63 //画像が入ったセルのリセット&挿入 64 SpreadsheetApp.flush(); 65 fsht.getRange("A6").clearContent();//画像のリセット 66 fsht.getRange("A6").setFormula("=IMAGE('フォームの回答 1'!H1)") 67 SpreadsheetApp.flush(); 68 SpreadsheetApp.flush(); 69 SpreadsheetApp.flush(); 70 SpreadsheetApp.flush(); 71 72 73} 74 75 76//------------------------ここまで完成-----------------------// 77 78//------------------------ここまで完成-----------------------// 79function createPDF() { 80 81 var ss = SpreadsheetApp.getActiveSpreadsheet(); 82 83 84 // PDF出力するシートを指定 85 var sheetName = 'シート'; 86 var ssId = ss.getId(); 87 var sheetId = ss.getSheetByName(sheetName).getSheetId(); 88 89 // スプレッドシートをPDF出力するためのURL 90 const url = 'https://docs.google.com/spreadsheets/d/' + ssId + '/export?' 91 92 //myFunction(); 93 SpreadsheetApp.flush();//表面上のデータをリセット 94 95 var options = 'exportFormat=pdf&format=pdf' 96 + '&gid=' + sheetId //PDFにするシートの「シートID」 97 + '&portrait=true' //true(縦) or false(横) 98 + '&size=A4' //印刷サイズ 99 + '&fitw=true' //true(幅を用紙に合わせる) or false(原寸大) 100 + '&gridlines=false' //グリッドラインの表示有無 101 + '&range=A1%3AG36' //★POINT★セル範囲を指定 102 // %3A はコロン(:)を表す 103 104 var requestUrl = url + options; 105 106 //API使用のためのOAuth認証 107 var token = ScriptApp.getOAuthToken(); 108 109 var params = { 110 'headers' : {'Authorization':'Bearer ' + token}, 111 'muteHttpExceptions' : true 112 }; 113 114 var response = UrlFetchApp.fetch(requestUrl, params); 115 116 //下記はフォルダーの名前を設定するコード 117 var fsht = ss.getSheetByName('シート'); 118 //var userNo = fsht.getRange("G1").getValue(); 119 //var userName = fsht.getRange("J3").getValue(); 120 //var userId = fsht.getRange("D2").getValue(); 121 var dateOfIssue = fsht.getRange("G1").getValue(); 122 //dateOfIssue = Utilities.formatDate(dateOfIssue, 'Asia/Tokyo', 'yyy-MM-dd'); 123 var blob = response.getBlob().setName(`【題名】${dateOfIssue}.pdf`);//@+shift 124 125 //フォルダーIDを取得してPDFファイルを収納 126 var folderId = 'フォルダーID'; 127 var folder = DriveApp.getFolderById(folderId); 128 folder.createFile(blob); 129 130 131 //Utilities.sleep(2000);//PDF化を1枚行ったら数秒待たせるシステム 132 133 } 134 135

試したこと・調べたこと

上記の詳細・結果

teratailで 「SpreadsheetApp.flush();//表面上のデータをリセット」を3回使って解決した、WEBサイトでも同様の解決方法が示されていて、実行してみましたが、解決に至りませんでした。
また、(https://www.automation-technology.info/index.php/2022/02/28/post-526/)のサイトから、画像をBASE64形式に変換するとあったのでこちらも実行しましたが、変化無しでした。

調べて試行してみても解決に至らず、、、、

どのようにすれば解決されるのでしょうか?
よろしくお願いいたします。

補足

特になし

コメントを投稿

0 コメント