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

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

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

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

3回答

607閲覧

重複データの入力されている列から重複を除き、残ったデータの名前でフォルダ名を作成したい

pinguu

総合スコア7

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

0グッド

0クリップ

投稿2020/01/23 02:28

お世話になります。
重複データの入力されているA列から重複を除き、残ったデータの名前でフォルダ名を作成したい。
再度実行した際にA列にあるデータ名で作成されたフォルダが存在する場合は上書きしない。
と言った事をしたいのですが、

・現状実行すると、C列に抜き出したデータ名のフォルダ以外に複数の「New Folder」と名前のついたフォルダーが作られています。
これはC列に「UNIQUE関数」を使用したからなのでしょうか。
・フォルダを確認し、上書きしない、同じ物を作成させない方法がわかりません。

教えて下さい。宜しくお願いします。

function createFolders() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getActiveSheet();
var folderID = "IDを記入しています";
var folder = DriveApp.getFolderById(folderID);
//var folderUrl = folder.getUrl();
var folderName = folder.getName();

//A列にデータ入力・C列に「=UNIQUE('シート1'!A2:A)」としてデータを抜き出しています。

var lastRow = sh.getLastRow();
var folderNamesToCreate = sh.getRange(2,3,lastRow-1,1).getValues();
for (var i = 0; i < folderNamesToCreate.length; i++){
folder.createFolder(folderNamesToCreate[i]);

}

ネットで色々と調べて下記の様なものを使用するのかと思いましたが
この場合のフォルダーネームがわかりません。

var folderNames =
var root = DriveApp.getRootFolder();
var folders = folder.getFoldersByName( folderNames );

if( folders.hasNext() ) {

folder = childs.next();
} else {

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

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

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

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

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

guest

回答3

0

フォルダの重複作成を防止する件に関しては私の能力では分かりませんでした。
結果として、C列を参照にしていた上記をE列に変更し、D列を作業列として
関数を入れて重複以外をE列に抽出する事で作業を進める事ができました。
papinianus様のお陰で作業を進める事が出来ました。
有り難う御座いました。
ご指導いただきました通り、動く所からちょこちょことやっていきます。
今後も色々とご指導お願いします。
見てくださった方々もありがとうございました。

投稿2020/01/24 04:05

pinguu

総合スコア7

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

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

0

フォルダの重複作成を防止する件に関しては私の能力では分かりませんでした。
結果として、C列を参照にしていた上記をE列に変更し、D列を作業列として
関数を入れて重複以外をE列に抽出する事で作業を進める事ができました。

papinianus様のお陰で作業を進める事が出来ました。
有り難う御座いました。
ご指導いただきました通り、動く所からちょこちょことやっていきます。
今後も色々とご指導お願いします。

見てくださった方々もありがとうございました。
今後とも宜しくお願いします。

投稿2020/01/24 04:03

pinguu

総合スコア7

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

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

0

ベストアンサー

A 列のみ参照

javascript

1function createFolders() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const folderID = "IDを記入しています"; 4 const colA = 0; 5 6 const folder = DriveApp.getFolderById(folderID); 7 const existingChildren = getFolderNames(folder); 8 const colAunique = sheet.getDataRange().getValues().map(function(e) { return e[0];}).filter(function(e,i,a) { return a.indexOf(e) === i;}) 9 colAunique.forEach(function(e) { 10 if(existingChildren.indexOf(e) > -1) return; 11 folder.createFolder(e);}); 12} 13function getFolderNames(folder) { 14 const iter = folder.getFolders(); 15 var ret = []; 16 while(iter.hasNext()) { 17 var child = iter.next(); 18 ret.push(child.getName()); 19 } 20 return ret; 21}

lastRowで処理しているので、重複が省かれてAより短くなったC列の空セルから空文字列が取得されてしまい、無名フォルダを作ろうとした結果デフォルト名で作成されていると推測。

createFolderするまえに folderNamesToCreate[i] !== "" を確認すればよさそう。

2回目以降同じ名前のフォルダがどうなるかは考えてない。
(エラーになるならtry catchすればいいが、同じ名前があるとnew Folderにフォールバックされるとなると厄介)

javascript

1//A列にデータ入力・C列に「=UNIQUE('シート1'!A2:A)」としてデータを抜き出しています。 2 3var lastRow = sh.getLastRow(); 4var folderNamesToCreate = sh.getRange(2,3,lastRow-1,1).getValues(); 5for (var i = 0; i < folderNamesToCreate.length; i++){ 6if(folderNamesToCreate[i] === "") continue; //これ 7folder.createFolder(folderNamesToCreate[i]); 8}

投稿2020/01/23 03:19

編集2020/01/24 14:10
papinianus

総合スコア12705

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

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

pinguu

2020/01/23 05:38

papinianus様 ご回答ありがとうございます。 >>createFolderするまえに folderNamesToCreate[i] !== "" を確認すればよさそう。 ご指導いただきました件ですが、下記の様にするとエラーになります。 (理解できておらず申し訳ありません。) もう少ご指導いただけましたら幸いです。 宜しくお願いします。 var olderNamesToCreate = olderNamesToCreate[i] !== ""; for (var i = 0; i < folderNamesToCreate.length; i++){ if( olderNamesToCreate.hasNext() ) { folder = childs.next(); } else { folder.createFolder(folderNamesToCreate[i]); }
papinianus

2020/01/23 08:17 編集

書きました。 そのコードはどこからでてきたのですか?ネットで調べる前の質問にあるコードを直しました。 動いているところから始めましょう。うごいていないものに何かを足しても混乱するだけです。
pinguu

2020/01/23 09:11

papinianus様 ありがとうございます。 コードに関してはネットで希望に合う物を調べて貼り合わせたものとなります。 仰る通り、仕事で上司より指示を受けて、分からない者(私)が作成しており混乱の連続です。 ご迷惑をお掛けして申し訳ありません。 先程ご指導いただきましたコードを実行しましたら、New Folderが出来ました。 分からないなりに下記の様にすると今のところ、New Folderが出なくなりました。 var lastRow = sh.getLastRow(); var folderNamesToCreate = sh.getRange(2,3,lastRow-1,1).getValues(); for (var i = 0; i < folderNamesToCreate.length; i++){ if(folderNamesToCreate[i] == ""){ } else { folder.createFolder(folderNamesToCreate[i]); } } ただ、回数分データのフォルダが作成されてしまいます。 ご指導いただいた通り、動く部分から私なりに考えてまいりますので、 引き続きご指導いただけましたら幸いです。 宜しくお願いします。
papinianus

2020/01/23 09:37

> 回数分データのフォルダ というところの意味がわかりません。
pinguu

2020/01/23 23:58

papinianus様 お早う御座います。 回数分と言うのは、A列に10個データがあった場合、 2回実行ボタンを押したら20個フォルダ作成されてしまいます。 表現不足でした。 宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問