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

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

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

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

Google Apps Script

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

解決済

GAS 素人に知識とアイディアを下さい。

Banana
Banana

総合スコア3

Google スプレッドシート

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

Google Apps Script

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

1回答

-1評価

0クリップ

498閲覧

投稿2022/06/18 08:14

編集2022/06/23 03:04

前提

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

function RefreshUpdate() {  ///1つ目の失敗作 (ここの掲示用に書き直したので歪な文章の可能性あり) //COL指定 const col_A = "A"; const col_B = "B"; const col_L = "L"; //シート取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); const form_sh = ss.getSheetByName('フォームの回答 1'); const org_sh = ss.getSheetByName('掲示板'); //値変数取得 シート名”FORM” var formVal = form_sh.getRange(col_A + "2:" + col_L + form_sh.getLastRow()).getValues(); //フィルター#1 >>更新日”空白”を抽出 var formFil1 = formVal.filter(array => array[11] === ""); //値変数取得 シート名”ORG” const orgVal = org_sh.getRange(col_A + "1:" + col_B + org_sh.getLastRow()).getValues(); //時間取得 const posTime = new Date(formVal[0][0]); posTime.setHours(0, 0, 0, 0); //const posTime_Format = Utilities.formatDate(posTime, 'HST', 'yyyy/MM/dd '); const update = new Date(); update.setHours(0, 0, 0, 0); const update_Format = Utilities.formatDate(update, 'HST', 'yyyy/MM/dd '); //フィルター#2 >>投稿日の削除 for (var f = 0; f < formFil1.length; f++) { formFil1[f].shift(); } if (f.length < 1) return; //フィルター#3 >>フラットにして”空白”の削除 const formFil2 = formFil1.flat(); const formFil3 = formFil2.filter(val => val); //更新日挿入 const orgVal_Temp = [] orgVal_Temp.push([update_Format, formFil3[0]]) for (var ff = 1; ff < formFil3.length; ff++) { orgVal_Temp.push(["〃", formFil3[ff]]); } if (ff.length < 1) return; //ORGシートに貼り直し orgVal.splice(1, 0, ...orgVal_Temp); org_sh.getRange(1, 1, orgVal.length, orgVal[0].length).setValues(orgVal); //ここから FORMシートに更新日追加して上書き for (var fff = 0; fff < formFil1.length; fff++) { formFil1[fff].pop();   //更新日の”空白”削除 formFil1[fff].push(update_Format);   //更新日の追加 var found = false; for (var fv = 0; fv < formVal.length; fv++) { if (formVal[fv][0].getTime() === formFil1[fff][0].getTime() && formVal[fv][1] === formFil1[fff][1]) { formVal[fv] = formFil1[fff];   //内容の上書き found = true; break; } } } form_sh.getRange(col_A + "2:" + col_L + (formVal.length + 2 - 1)).setValues(formVal); }; ************************************************** function RefreshUpdate() {  ///2つ目 [動作確認済み] //COL指定 const col_A = "A"; const col_B = "B"; const col_L = "L"; //シート取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); const form_sh = ss.getSheetByName('フォームの回答 1'); const org_sh = ss.getSheetByName('掲示板'); //値配列取得 ”FORM” 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 >>更新日”空白”を抽出 const formFil_F = formVal_F.filter(array => array[11] === ""); const formFil_O = formVal_O.filter(array => array[11] === ""); //値変数取得 ”ORG” const orgVal = org_sh.getRange(col_A + "1:" + col_B + org_sh.getLastRow()).getValues(); //時間取得 const posTime = new Date(formVal[0][0]); posTime.setHours(0, 0, 0, 0); const posTime_Format = Utilities.formatDate(posTime, 'HST', 'yyyy/MM/dd '); const posGetTime = posTime.getTime(); const update = new Date(); update.setHours(0, 0, 0, 0); const update_Format = Utilities.formatDate(update, 'HST', 'yyyy/MM/dd '); const updateGetTime = update.getTime(); //フィルター#2 >>投稿日の削除 for (var f = 0; f < formFil_O.length; f++) { formFil_O[f].shift(); } if (f.length < 1) return; //フィルター#3 >>フラットにして”空白”の削除 const formVFlat_O = formFil_O.flat(); const formFil2_O = formVFlat_O.filter(val => val); //更新日挿入 const orgVal_Temp = [] orgVal_Temp.push([update_Format, formFil2_O[0]]) for (var ff = 1; ff < formFil2_O.length; ff++) { orgVal_Temp.push(["〃", formFil2_O[ff]]); } if (ff.length < 1) return; //新しい日付を一番先頭に挿入 >>ORGシートに貼り直し orgVal.splice(1, 0, ...orgVal_Temp); org_sh.getRange(1, 1, orgVal.length, orgVal[0].length).setValues(orgVal); //ここから FORMシートに更新日追加して上書き for (var fff = 0; fff < formFil_F.length; fff++) { formFil_F[fff].pop();   //更新日の”空白”削除 formFil_F[fff].push(update_Format);   //更新日の追加 var found = false; for (var fv = 0; fv < formVal.length; fv++) { if (formVal[fv][0].getTime() === formFil_F[fff][0].getTime() && formVal[fv][1] === formFil_F[fff][1]) { formVal[fv] = formFil_F[fff];   //内容の上書き found = true; break; } } } form_sh.getRange(col_A + "2:" + col_L + (formVal.length + 2 - 1)).setValues(formVal); };

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

qnoir

2022/06/18 11:39 編集

1番目の //フィルター#1 >>更新日”空白”を抽出 var formFil_F = formVal_F.filter(array => array[11] === ""); この右側の「formVal_F」はこの行以前のどこにも現れていないように見えます。 したがって正しくは「formVal」ではないですか? 「(これは1つ目のFOR文の後から、定数の中身が手前で走査した別の値が代入されてしまうという状態になり本来欲しい値が得られないので諦めました。)」 →「定数」とは、変数名でいうとどれですか? 「手前で操作した別の値」とは具体的にコードの部分の値ですか? 「本来欲しい値」とは、たとえば具体的にどのような値でしょうか?
Banana

2022/06/19 16:55

投稿内容が雑で申し訳ありませんでした。 昨日、投稿内容の書き直しをしましたので、もしよろしければもう一度ご確認をいただけないでしょうか? ぜひよろしくお願いいたします。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google スプレッドシート

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

Google Apps Script

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