質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Q&A

解決済

1回答

551閲覧

GAS 任意のスプレッドシートにフォームの回答を反映させる際にチェックボックスのチェック項目をすべて反映させたい

e-y

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

0グッド

0クリップ

投稿2022/09/08 12:51

前提

フォーム送信時に、任意のスプレッドシートにフォームの回答を反映させ、任意の宛先に自動通知メールが飛ぶようにしたいのですが
任意のスプレッドシートが2種類あり(PDF、エクセル)、それぞれに必要な項目を該当セルに反映させたときに、チェックボックス
の回答が一部しか拾えない状態です。

実現したいこと

  • 任意のスプレッドシート(今回は2種類あり)に、フォームで複数選択したチェックボックスの回答を反映させたい。
  • チェックボックスの質問項目が複数あり、回答必須(最低1つはどれかにチェックが必要)のものと、

   チェックゼロでもOKな項目があるため、チェックゼロでもOKとする処理方法についても教えていただきたいです。

発生している問題・エラーメッセージ

チェックボックスにチェックされた複数項目のうち、ひとつめしか反映されない状態です。

該当のソースコード

GAS

1//フォーム送信時にPDFとスプシを添付して指定宛先にメールを送信 2// FormApp.getActiveForm() 3function myFunction(event) { 4 5 //今日の日付 6 var request_date = new Date(); 7 8 // フォーム 9 var res = event.response.getItemResponses(); 10 11 var staff_name; 12 var cc_mailaddress; 13 var proposal_num; 14 var project_title; 15 var address; 16 var resuest_timing; 17 var resuest; 18 //以下60項目くらいあり 19 20 for (var n in res) { 21 var item = res[n]; 22 var name = item.getItem().getTitle(); 23 var value = item.getResponse(); 24 25 switch (name) { 26 case '担当': 27 staff_name = value; break; 28 case 'CC送付先': 29 cc_mailaddress = value; break; 30 case '番号': 31 proposal_num = value; break; 32 case '件名': 33 project_title = value; break; 34 case '住所': 35 address = value; break; 36 case '依頼タイミング': 37 resuest_timing = value; break; 38 case '依頼内容': 39 resuest = value; break; 40  //以下60項目くらいあり 41 } 42 } 43 44 // スプレッドシートURLから抽出したIDを入力 45 var ssid1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 46 var ss = SpreadsheetApp.openById(ssid1); 47 // 変換元のスプレッドシート名(タブ名) 48 var pdfss = ss.getSheetByName("【依頼】"); 49 var sheetid = ss.getActiveSheet().getSheetId(); 50 51 pdfss.getRange("U3").setValue(request_date); //依頼日 52 pdfss.getRange("C3").setValue(staff_name); //担当 53 pdfss.getRange("H3").setValue(cc_mailaddress); //CC送付先(メールアドレス) 54 pdfss.getRange("F5").setValue(proposal_num); //番号 55 pdfss.getRange("F9").setValue(project_title); //件名 56 pdfss.getRange("F10").setValue(address); //住所 57 pdfss.getRange("K5").setValue(resuest_timing); //依頼タイミング 58 pdfss.getRange("F6").setValue(resuest); //依頼内容 //チェックボックス(複数回答可)必須項目 59 //以下60項目くらいあり 60 61 SpreadsheetApp.flush(); 62 63 // 以下PDF化コード(サイズ=A4) 64 var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid1); //////////// 65 var url_ext = []; 66 67 var opts = { 68 format: "pdf", 69 size: "A4", 70 fzr: "false", 71 portrait: "true", 72 gridlines: "false", 73 printtitle: "false", 74 pagenumbers: "false", 75 fitw: "true", 76 sheetnames: "false", 77 gid: sheetid 78 }; 79 80 // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納 81 for (optName in opts) { 82 url_ext.push(optName + "=" + opts[optName]); 83 } 84 85 // url_extの各要素を「&」で繋げる 86 var options = url_ext.join("&"); 87 Logger.log(options) 88 89 try { 90 // API使用のためのOAuth認証 91 var token = ScriptApp.getOAuthToken(); 92 93 var response = UrlFetchApp.fetch(url + options, { 94 headers: { 95 "Authorization": "Bearer " + token 96 } 97 }); 98 99 // Googleドライブ上のPDF格納先フォルダからIDを入力 100 var folder = DriveApp.getFolderById("yyyyyyyyyyyyyyyyyyyyyyyyyyyyy"); 101 102 // PDFファイルを作成:ファイル名「番号_依頼(依頼タイミング)yyMMdd.pdf」 103 var pdfName = proposal_num + "_" + project_title + "(" + resuest_timing + ")" + Utilities.formatDate(request_date, "JST", "yyMMdd") + '.pdf'; 104 var pdf = response.getBlob().setName(pdfName); 105 folder.createFile(pdf); 106 107 // テンプレートシートの取得 108 var ssid2 = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'; 109 var sheetname2 = 'フォーマット'; // 変換元のシート名(タブ名) 110 var ss2 = SpreadsheetApp.openById(ssid2); 111 var sheet = ss2.getSheetByName(sheetname2); 112 113 // テンプレートシートの内容をフォーム入力値に置き換える。 114 sheet.getRange("A4").setValue(staff_name); 115 sheet.getRange("A5").setValue(Utilities.formatDate(request_date, "JST", "yy/MM/dd")); 116 sheet.getRange("C7").setValue(proposal_num); 117 sheet.getRange("C8").setValue(project_title); 118 sheet.getRange("C9").setValue(aaa); 119 sheet.getRange("C10").setValue(bbb); 120 sheet.getRange("C11").setValue(resuest); //チェックボックス(複数回答可)必須項目 121 sheet.getRange("C15").setValue(ccc); //チェックボックス(複数回答可)チェックなしでもOK 122 sheet.getRange("G15").setValue(ddd); //チェックボックス(複数回答可)チェックなしでもOK 123 sheet.getRange("C16").setValue(eee); //チェックボックス(複数回答可)チェックなしでもOK 124 sheet.getRange("G16").setValue(fff); //チェックボックス(複数回答可)チェックなしでもOK 125 sheet.getRange("C17").setValue(fin_num); 126 127 SpreadsheetApp.flush(); 128 129 // エクセルファイルを作成:ファイル名「番号_ファイル名_yyMMdd.xlsx」 130 var excelName = proposal_num + "_" + "ファイル名" + "_" + Utilities.formatDate(request_date, "JST", "yyMMdd") + '.xlsx'; 131 var excel = getExcel(ssid2, sheetname2, excelName); 132 folder.createFile(excel); 133 134 // メールを送信する。 135 MailApp.sendEmail("abc@def.jp", "【新規依頼】" + proposal_num + "_" + project_title + "(担当:" + staff_name + ")", "---------------自動通知---------------\n" + "\n" + "新規依頼を受け付けました。\n" + "エクセルファイルは必要に応じてダウンロードしてください。\n" + "\n" + Utilities.formatDate(request_date, "JST", "yyyy/MM/dd H:mm"), {//------- 136 attachments: [pdf, excel] 137 }); 138 } catch (e) { 139 Logger.log("ファイル生成に失敗しました\n" + e.stack); 140 } 141} 142 143//以下はエクセルファイル作成用 144// ssid;スプレッドシートID、 145// sheetname;シート名 146// filename;保存するファイル名 147function getExcel(ssid, sheetname, filename) { 148 const ss = SpreadsheetApp.openById(ssid); 149 const sh = ss.getSheetByName(sheetname) 150 const sheetid = sh.getSheetId() 151 const url = 'https://docs.google.com/spreadsheets/d/' + ssid + '/export?format=xlsx&gid=' + sheetid; 152 const option = { 153 "headers": { Authorization: "Bearer " + ScriptApp.getOAuthToken() }, 154 "muteHttpExceptions": true 155 }; 156 const blob = UrlFetchApp.fetch(url, option).getBlob().setName(filename); 157 return blob; 158}

試したこと

複数回答取得のためにチェックボックスの項目をsetValuesにすればいいのかなと思い試してみましたが、エラーとなってしまいました。
エラー Exception: The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues. at myFunction(◯◯宛:243:24)

補足情報(FW/ツールのバージョンなど)

・フォームアンケートの該当チェックボックス項目(必須の項目もあれば、必須でない項目もあります、その他に記述も可能な状態です)
イメージ説明

・スプレッドシートのどのセルに、どのように記入したいのか(一例ですが、すべておなじような感じで横並びに表示したいです)
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

たとえばPDF用シートのF6セルに依頼内容(resuest)を入力するようになっているとした場合、
pdfss.getRange("F6").setValue(resuest);

pdfss.getRange("F6").setValue((resuest ?? []).join());

に変えてみてください。

テンプレートシートへの記入処理の部分も同様に
sheet.getRange("C11").setValue(resuest);

sheet.getRange("C11").setValue((resuest ?? []).join());
のように変えてみてください。

投稿2022/09/08 13:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

e-y

2022/09/09 01:43

ご回答いただきありがとうございます。 チェックボックスの項目のところを教えていただいたとおりに変更したところ、すべてテンプレートシートに抽出されるようになりました。 余談ですが、resuestってめちゃくちゃ誤字っていてお恥ずかしいかぎりです。 またエラーがでないようにすべての誤字をrequestに修正します。突っ込まないでいてくれてありがとうございます。 心が折れそうでしたが、本当に助けられました。これからも教えていただいた内容をしっかり咀嚼して身につけていこうと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問