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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

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

Q&A

1回答

4144閲覧

スプレッドシートでデータを転記GAS

20050619

総合スコア0

Google Apps Script

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

0グッド

1クリップ

投稿2021/10/12 02:05

編集2021/10/12 02:18

google スプレッドシートで集計のシートへデータ入力後にデータの転記を行いたいと思いWEB検索をしたところ、
直ぐにGASを投稿しているサイトを見つけて使用して見ましたがデバックが出てしまいます。
https://fastclassinfo.com/entry/gas_data_tenki/
スクリプトエディタ
// プログラム0|スプレッドシート名の設定
function DivideData() {
// プログラム1|スプレッドシートの情報を取得
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('集計');

// プログラム2|スプレッドシートのデータを二次元配列として取得
var myRange = sheet.getDataRange().getValues();

// プログラム3|空の配列を設定
var products = [];

// プログラム4|プログラム2の集計の1列目は除外、2列目の日付時間~シート転記(Z列)をプログラム3の空配列に取得
for (var i=1; i<myRange.length; i++){
products.push(myRange[i][25]);
}

// プログラム5|プログラム4の商品名の重複を削除
var product_list = products.filter(function(value, i, self){
return self.indexOf(value) === i;
});

// プログラム6|商品名ごとに繰り返す
for (var i=0; i<product_list.length; i++){

// プログラム7|空の配列を設定 var myproducts = []; // プログラム8|ヘッダー情報を取得 myproducts.push(myRange[0]); // プログラム9|シート転記が一致すれば、その情報を配列に格納 for (var k=0; k<myRange.length; k++){ if (myRange[k][25] == product_list[i]){ myproducts.push(myRange[k]); } } // プログラム10|シートを追加 var sheetsnum = spreadsheet.getNumSheets(); var newsheet = spreadsheet.insertSheet(product_list[i], sheetsnum); // プログラム11|新規追加したシートに情報を貼り付け newsheet.getRange(1,1,myproducts.length,myproducts[0].length).setValues(myproducts);

}
}

実行をするとプログラム9でデバックが表示されます。
10:40:45 エラー
Exception: シート名「一般」はすでに存在しています。別の名前を入力してください。
DivideData @ コード.gs:41

GASが初心者以下の為、上記のプログラム修正が出来ません。
あと実行した際に集計シートでデータの入力をして、
実行を何回もした場合でもエラー表示がされない様にしたいのと、
このプログラムは新規データのみに実行が可能の為、
追加のデータが入力されても転記される様にしたいです。
お手数ですが、よろしくお願いいたします。

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

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

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

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

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

k_code

2021/10/13 03:25 編集

>実行をするとプログラム9でデバックが表示されます。 とのことですが、一度目は動作するんでしょうか? また、質問をする際はMarkDownを用いて書いていただけますとよりよい回答に出会える可能性が出ますので使うことを推奨します。 ・teratailでのプログラミング初心者の質問の仕方 https://www.haya-programming.com/entry/2019/06/22/235031
20050619

2021/10/13 03:40

>実行をするとプログラム9でデバックが表示されます。 とのことですが、一度目は動作するんでしょうか? 最初、 集計シートだけの状態で実行をするとデータ転記がシート別に作成されますが、 プログラム9でエラーになってしまいます。 2回目は実行出来ません。 お手数ですが、よろしくお願いいたします。
k_code

2021/10/13 04:14 編集

>2回目は実行出来ません。 これに関してですが、 『一度目でシート作成の際で使われている名前が二回目でも使用している。』 ということでエラーが発生しています。 そのため、どのようなイメージで作成されているのかわからないので何とも言えないですが、今のところ二回目以降二つの作成方法があり、 ・シートを集計シート以外なくして作成する方法 ・その後はトリガーを設定して得た情報をもとにシートを検索・入力する方法 があります。 ただ、どのようなシート状況・いくつのシート分類があるのか等々わからないものがあるため、回答には至れません。 お手数ですが、それを踏まえたうえで追記していただけるとありがたいです。
20050619

2021/10/20 08:13

解決致しました。 ありがとうございました。
guest

回答1

0

やりたいことの追記がないので、お手軽な解決策として insert する前に消すことを考えました。

同名のシートが既に存在していたら clearContent して、末尾に移動させると書式が維持できます。
また内容そのものを維持したいのであれば、実行した日時をシート名に付けるなどして、重複にならないような方法も考えられます。
これらも結局は、書式を維持したい、以前の集計を残したいなど、やりたいことに依存します。

javascript

1function DivideData() { 2// プログラム1|スプレッドシートの情報を取得 3 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheet = spreadsheet.getSheetByName('集計'); 5 6// プログラム2|スプレッドシートのデータを二次元配列として取得 7 var myRange = sheet.getDataRange().getValues(); 8 9// プログラム3|空の配列を設定 10 var products = []; 11 12// プログラム4|プログラム2の集計の1列目は除外、2列目の日付時間~シート転記(Z列)をプログラム3の空配列に取得 13 for (var i=1; i<myRange.length; i++){ 14 products.push(myRange[i][25]); 15 } 16 17// プログラム5|プログラム4の商品名の重複を削除 18 var product_list = products.filter(function(value, i, self){ 19 return self.indexOf(value) === i; 20 }); 21 22// プログラム6|商品名ごとに繰り返す 23 for (var i=0; i<product_list.length; i++){ 24 25// プログラム7|空の配列を設定 26 var myproducts = []; 27 28// プログラム8|ヘッダー情報を取得 29 myproducts.push(myRange[0]); 30 31// プログラム9|シート転記が一致すれば、その情報を配列に格納 32 for (var k=0; k<myRange.length; k++){ 33 if (myRange[k][25] == product_list[i]){ 34 myproducts.push(myRange[k]); 35 } 36 } 37 38// プログラム10|シートを追加 39 deleteSheetIfExist(spreadsheet,product_list[i]); 40 var sheetsnum = spreadsheet.getNumSheets(); 41 var newsheet = spreadsheet.insertSheet(product_list[i], sheetsnum); 42 43 44// プログラム11|新規追加したシートに情報を貼り付け 45 newsheet.getRange(1,1,myproducts.length,myproducts[0].length).setValues(myproducts); 46 } 47} 48function deleteSheetIfExist(spreadsheet, name) { 49 const sheet = spreadsheet.getSheetByName(name); 50 if(sheet === null) return; 51 spreadsheet.deleteSheet(sheet); 52}

投稿2021/10/15 17:06

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問