
前提
google formsから送信された回答内容(複数項目)をスプレッドシート内に掲示板のように1項目毎に分解し、日にち毎に並び替えて表示。
というスクリプト作成を行なっています。
現状、自分なりに出来上がったけど、本当にこれでよかったのか?FOR文とか多いし、同じ情報の定数を分岐用に重複作成しているし、もっと簡潔な書き方があるんじゃないかと思っているのですが、どうにもこうにも分からず、知識を分けていただけないかと投稿しました。
今件に関してスクリプトを二つ載せます。
1つ目は失敗作 [解決策分からずボツ] //ひとつの変数[ formVal ]を元にで全文に対応できないかと書いてみたスクリプトです。
2つ目はの改善版です [動作確認済み]
1つ目に求める動作は以下です。
1.フォーマット回答受信 シート名”FORM” (内容はcolmA_タイムスタンプ、colmB-K_10個分の回答枠、colmL_増設した更新日枠)
2. 1を変数[ formVal ]としてシート全体を取得
3.フィルター[ formFil1 ]を通して、新しい受信記録だけを抽出([ formVal ]内の更新日の有無で判別。新規の回答には更新日は含まれておらず、このスクリプトの完了時に日付を入れる仕組みです。)
4.その後も[formFil2] > [formFil3]と掲示用 シート名”ORG”仕様に形状を変え完成したものをシート名”ORG”に貼り付け
5. 3で’使用した変数[ formFil1 ]を再宣言
6.[ formFil1 ]のか空白の更新日欄に更新日を追加してシート名”FORM”内で上書き
[ エラ-症状 ]
エラー症状としては、上記4の”ORG”に貼り付けまでは問題なく動くのですか、
5.で変数[ formFil1 ]を再宣言した時に[formFil2]の値が返ってきてしまうというものです。
>>>どうしてそうなってしまうのか?原因が知りたいです。
2つ目は [動作確認済み]
2つ目は1つ目が解決できなかったので、最初から変数を[ formVal ]だけでなく[formVal_F]と[formVal_O]を重複作成し動作までこぎついたスクリプトです。
var formVal = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues();
const formVal_F = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues();
const formVal_O = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues();
>>>これに関して、本当にこういった書き方でも良いのか?壊れやすい書き方は1つ目と2つ目のどっちなのか?もっと簡略化した書き方やアドバイスをいただきたいです。
素人ながら考えたスクリプトですので悪しからず、、、
説明文が悪く、6/18に書き直しをしてみました。もしよろしければ、答え合わせに付き合っていただける方是非、返答をお願いします。
よろしくお願いします!!
該当のソースコード
GAS
1function RefreshUpdate() { ///1つ目の失敗作 (ここの掲示用に書き直したので歪な文章の可能性あり) 2 3 //COL指定 4 const col_A = "A"; 5 const col_B = "B"; 6 const col_L = "L"; 7 8 //シート取得 9 var ss = SpreadsheetApp.getActiveSpreadsheet(); 10 const form_sh = ss.getSheetByName('フォームの回答 1'); 11 const org_sh = ss.getSheetByName('掲示板'); 12 13 //値変数取得 シート名”FORM” 14 var formVal = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues(); 15 16 //フィルター#1 >>更新日”空白”を抽出 17 var formFil1 = formVal.filter(array => array[11] === ""); 18 19 //値変数取得 シート名”ORG” 20 const orgVal = org_sh.getRange(col_A + "1:" + col_B + org_sh.getLastRow()).getValues(); 21 22 //時間取得 23 const posTime = new Date(formVal[0][0]); posTime.setHours(0, 0, 0, 0); //const posTime_Format = Utilities.formatDate(posTime, 'HST', 'yyyy/MM/dd '); 24 const update = new Date(); update.setHours(0, 0, 0, 0); 25 const update_Format = Utilities.formatDate(update, 'HST', 'yyyy/MM/dd '); 26 27 //フィルター#2 >>投稿日の削除 28 for (var f = 0; f < formFil1.length; f++) { 29 formFil1[f].shift(); 30 } if (f.length < 1) return; 31 32 //フィルター#3 >>フラットにして”空白”の削除 33 const formFil2 = formFil1.flat(); 34 const formFil3 = formFil2.filter(val => val); 35 36 //更新日挿入 37 const orgVal_Temp = [] 38 orgVal_Temp.push([update_Format, formFil3[0]]) 39 for (var ff = 1; ff < formFil3.length; ff++) { 40 orgVal_Temp.push(["〃", formFil3[ff]]); 41 } if (ff.length < 1) return; 42 43 //ORGシートに貼り直し 44 orgVal.splice(1, 0, ...orgVal_Temp); 45 org_sh.getRange(1, 1, orgVal.length, orgVal[0].length).setValues(orgVal); 46 47 //ここから FORMシートに更新日追加して上書き 48 for (var fff = 0; fff < formFil1.length; fff++) { 49 formFil1[fff].pop(); //更新日の”空白”削除 50 formFil1[fff].push(update_Format); //更新日の追加 51 var found = false; 52 for (var fv = 0; fv < formVal.length; fv++) { 53 if (formVal[fv][0].getTime() === formFil1[fff][0].getTime() && formVal[fv][1] === formFil1[fff][1]) { 54 formVal[fv] = formFil1[fff]; //内容の上書き 55 found = true; 56 break; 57 } 58 } 59 } 60 61 form_sh.getRange(col_A + "2:" + col_L + (formVal.length + 2 - 1)).setValues(formVal); 62 63 64}; 65 66************************************************** 67 68function RefreshUpdate() { ///2つ目 [動作確認済み] 69 70 //COL指定 71 const col_A = "A"; 72 const col_B = "B"; 73 const col_L = "L"; 74 75 //シート取得 76 var ss = SpreadsheetApp.getActiveSpreadsheet(); 77 const form_sh = ss.getSheetByName('フォームの回答 1'); 78 const org_sh = ss.getSheetByName('掲示板'); 79 80 //値配列取得 ”FORM” 81 var formVal = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues(); 82 const formVal_F = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues(); 83 const formVal_O = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues(); 84 85 //フィルター#1 >>更新日”空白”を抽出 86 const formFil_F = formVal_F.filter(array => array[11] === ""); 87 const formFil_O = formVal_O.filter(array => array[11] === ""); 88 89 //値変数取得 ”ORG” 90 const orgVal = org_sh.getRange(col_A + "1:" + col_B + org_sh.getLastRow()).getValues(); 91 92 //時間取得 93 const posTime = new Date(formVal[0][0]); posTime.setHours(0, 0, 0, 0); 94 const posTime_Format = Utilities.formatDate(posTime, 'HST', 'yyyy/MM/dd '); 95 const posGetTime = posTime.getTime(); 96 const update = new Date(); update.setHours(0, 0, 0, 0); 97 const update_Format = Utilities.formatDate(update, 'HST', 'yyyy/MM/dd '); 98 const updateGetTime = update.getTime(); 99 100 //フィルター#2 >>投稿日の削除 101 for (var f = 0; f < formFil_O.length; f++) { 102 formFil_O[f].shift(); 103 } if (f.length < 1) return; 104 105 //フィルター#3 >>フラットにして”空白”の削除 106 const formVFlat_O = formFil_O.flat(); 107 const formFil2_O = formVFlat_O.filter(val => val); 108 109 //更新日挿入 110 const orgVal_Temp = [] 111 orgVal_Temp.push([update_Format, formFil2_O[0]]) 112 for (var ff = 1; ff < formFil2_O.length; ff++) { 113 orgVal_Temp.push(["〃", formFil2_O[ff]]); 114 } if (ff.length < 1) return; 115 116 //新しい日付を一番先頭に挿入 >>ORGシートに貼り直し 117 orgVal.splice(1, 0, ...orgVal_Temp); 118 org_sh.getRange(1, 1, orgVal.length, orgVal[0].length).setValues(orgVal); 119 120 //ここから FORMシートに更新日追加して上書き 121 for (var fff = 0; fff < formFil_F.length; fff++) { 122 formFil_F[fff].pop(); //更新日の”空白”削除 123 formFil_F[fff].push(update_Format); //更新日の追加 124 var found = false; 125 for (var fv = 0; fv < formVal.length; fv++) { 126 if (formVal[fv][0].getTime() === formFil_F[fff][0].getTime() && formVal[fv][1] === formFil_F[fff][1]) { 127 formVal[fv] = formFil_F[fff]; //内容の上書き 128 found = true; 129 break; 130 } 131 } 132 } 133 134 form_sh.getRange(col_A + "2:" + col_L + (formVal.length + 2 - 1)).setValues(formVal); 135 136 137}; 138 139


回答1件
あなたの回答
tips
プレビュー