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

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

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

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

Google フォーム

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

Google Apps Script

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

1145閲覧

複数のグーグルフォームから入力された回答を別のスプシに転記させたい

yuki0137

総合スコア5

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/07/06 10:07

前提・実現したいこと

複数のグーグルフォームを管理しており、入力された回答は1つのスプレッドシートに集約され、各フォームごとにシートを分けて記載されるよう設定しています。
フォームへの回答をきっかけに、この集約されたスプレッドシートから別のスプレッドシートに回答を転記したいと考えています。

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

転記先のシートの最終行を正しく取得できておらず、空白の行が間に挟まってしまいます。
また、トリガーをフォーム送信時で設定しているのですが、他のフォームに回答があると、回答がないフォームについても、転記されるようになってしまいます。

該当のソースコード

function

1 2//今のアクティブファイルを取得する 3 var ss1_copy = SpreadsheetApp.getActiveSpreadsheet(); 4//転記先のスプレッドシートIDを入力する 5 var ss2_copy_to = SpreadsheetApp.openById("転記先のID"); 6//フォームの回答シート 7 var s_name_from = ss1_copy.getSheetByName('転記元のシート名'); 8//転記先のシート 9 var s_name_to = ss2_copy_to.getSheetByName('転記先のシート名'); 10//最終行+1行 11 var lastRow_PlusOne = s_name_to.getLastRow()+1; 12//転記元の最終行のデータを取得 13 var data = s_name_from.getRange(s_name_from.getLastRow(),1,1,s_name_from.getLastColumn()).getValues(); 14 15 Logger.log(data); 16 17 //setValueで書き込み 18 s_name_to.getRange(lastRow_PlusOne,1,1,s_name_from.getLastColumn()).setValues(data); 19} 20 21

試したこと

トリガーは1つだけでよいのか思い、1つ残して他は削除すると、やはりトリガーを削除したフォームの回答は転記されませんでした。
転記先の最終行+1を取得する文章も変えてみましたがうまく動きませんでした。

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

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

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

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

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

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

sawa

2020/07/06 12:45 編集

>入力された回答は1つのスプレッドシートに集約 とのことですが、これは回答シート毎にコードを用意して、それぞれトリガーをセットしてるってことでしょうか?それだと、いずれかのフォーム送信があったら全回答シートの最終行の転記が同時に実行されてしまうのでは? あと、転記先のシートは 1つで 全てのフォーム回答シートを1つのシートに集約したいってことでしょうか?
yuki0137

2020/07/07 00:06

コメントありがとうございます! >いずれかのフォーム送信があったら全回答シートの最終行の転記が同時に実行されてしまうのでは? やはりそうなのですね。では集約されているシートを各フォームの回答シートにバラしたうえで、それぞれにコードとトリガーを設定しないといけないということでよろしいでしょうか。 >転記先のシートは 1つで 全てのフォーム回答シートを1つのシートに集約したいってことでしょうか? はい、その通りです。
guest

回答1

0

ベストアンサー

フォーム送信時のトリガーで、最終行を取得するのではなく、回答があった行を取得する動きに変えてみてはいかがでしょうか。

現在のコードの全文がないので、どういった関数名がついてるかわかりませんが、仮に function formsubmit(){ という名前だとしたら、 function formsubmit(e){ と、引数 e を追加してみましょう。

回答先のシート名と転記先のシート名は同一とのことで、転記先のシートを指定する処理を追加しました。

function formsubmit(e){ //フォームから回答のあった行を取得 var data = e.range.getValues(); //回答が記載されるシート名を取得  var sheetname = e.range.getSheet().getSheetName(); //転記先のスプレッドシートIDを入力する  var ss2_copy_to = SpreadsheetApp.openById("転記先のID"); //転記先のシートを取得(シート名が同じなので)  var s_name_to = ss2_copy_to.getSheetByName(sheetname); //setValueで書き込み s_name_from.getLastColumn() はdata[0]の要素数で置き換え s_name_to.getRange(lastRow_PlusOne,1,1,data[0].length).setValues(data);

こうすると特に回答先のシート名を意識せず、回答があった部分だけが集約先シートに追記されると思います。謎の空白の行も、もしかすると上記で解決するかもしれません。(空白行の方は、私もコードからは原因がよくわかりませんでした)

ただ、同時タイミングでフォーム回答が複数あった時の挙動は保証できないので、そういったケースが想定され、上記コードでも挙動がおかしい場合は、別の手段を考えた方が良いかもしれません。
(回答先のスプレッドシートを分ける、集約方法を Query+importrangeの関数にしてみる等)

投稿2020/07/07 01:25

編集2020/07/07 06:00
sawa

総合スコア3002

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

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

yuki0137

2020/07/07 04:13 編集

ありがとうございます! 回答があったフォームだけ転記されるようになりました。 >転記先のシートは 1つで 全てのフォーム回答シートを1つのシートに集約したいってことでしょうか? 申し訳ありません、こちらの質問の意図を取り違えていたようです。 転記先のシートもフォームの回答シートごとに分けることを想定しています。 下記イメージで伝わりますでしょうか。 余談ですが、②のスプシには①のスプシ以外のフォームの回答シートからも回答を転記するように作成しています。 【イメージ】 Aのフォーム Bのフォーム ↓ ①のスプシ(各シートごとにフォームの回答が分けて記載される) Aのフォームの回答が記載されるシート、Bのフォームの回答が記載されるシート ↓ ②のスプシ(各シートごとにフォームの回答が分けて転記される) Aのフォームの回答が転記されるシート、Bのフォームの回答が転記されるシート data[0].lengthの部分を変えればよろしいのでしょうか。
sawa

2020/07/07 05:38

なるほど。その場合、回答が転記されるシートを指定する必要が出てきます。 回答が記載されるシート名と回答が転記されるシートには、なにかルール(関係性)はありますか? 例えば、 Aフォームの回答 → Aフォームの回答(転記) など。 ルールがあれば比較的簡単に出来そうです。ルールがない場合は、IFとかSwitchで元のシートごとにシートを指定していくことになるかと。
yuki0137

2020/07/07 05:50

>回答が記載されるシート名と回答が転記されるシートには、なにかルール(関係性)はありますか? 現状同じシート名となっていますが 、Aフォームの回答 → Aフォームの回答(転記)のように 転記先のシート名を変えて区別をつくようにすることは可能です。
sawa

2020/07/07 05:51

同じシート名なら比較的簡単に出来ます。回答更新しときます。
yuki0137

2020/07/07 06:31

ありがとうございます! 回答のあったフォームのみ、該当のシートに転記されるようになりました! いただいたものを組み合わせて下記のようにコードを書きましたが、認識合っていますでしょうか。 残念ながら謎の空白行については未だ発生していましたが、それはもう別の方法を探すしかなさそうでしょうか…。 function PostToAnotherFile(e){ //フォームから回答のあった行を取得 var data = e.range.getValues(); //回答が記載されるシート名を取得  var sheetname = e.range.getSheet().getSheetName(); //転記先のスプレッドシートIDを入力する  var ss2_copy_to = SpreadsheetApp.openById("転記先のID"); //転記先のシートを取得(シート名が同じなので)  var s_name_to = ss2_copy_to.getSheetByName(sheetname); //最終行+1行  var lastRow_PlusOne = s_name_to.getLastRow()+1; //これで回答のあった行を取得 var data = e.range.getValues(); Logger.log(data); //setValueで書き込み s_name_to.getRange(lastRow_PlusOne,1,1,data[0].length).setValues(data); }
sawa

2020/07/07 06:43

↑var data 2回あるのがおかしいです。 空白行は何行って決まってるのでしょうか?可能性としては、転記先のシートの書き込みする以外の列に数式や文字が入っていて、最終行が想定しているのと違うということが考えられます。思い当たりますか?とりあえず、 Logger.log(s_name_to.getLastRow()); で最終行をログを確認してみるのも良いかと。
yuki0137

2020/07/07 08:48

色々と伺ってしまい申し訳ありません。 空白はその時によりまちまちです。数行の場合もあれば、8000行ほどの場合もあります。 数式やセルの書式設定、プルダウンは設定されていますが、その切れ目に転記されているわけではありませんでした。また、一度空白の行を削除してみましたが、次に転記されるのは削除したのと同じだけの空白を挟んだ行となっていました。
sawa

2020/07/07 10:02

シート構成が細かくわからないので、これ以上最終行取得のアドバイスは難しいですね。 もし、回答が記載されるシートの行と 回答が転記されるシートの行が 同じで良いなら、もう最終行とか気にせず同じ行にコピペって動きにしてしまうのも手かと。 lastRow_PlusOne のとこを e.range.getRow() に置き換えで。
yuki0137

2020/07/07 10:22

var lastRow_PlusOne = s_name_to.getRange(s_name_to.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow()+1; に書き換えるとうまく最終行の下に転記するようになりました。 いろいろとアドバイスいただき本当にありがとうございました!
sawa

2020/07/07 10:25

指定した列の最終行の取得でいけましたか。解決してなにより。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問