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

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

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

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

Q&A

解決済

2回答

912閲覧

【Google Apps Script】一括で「テンプレート」シートから複数のスプレッドシート作成し、各スプレッドシートに異なった権限を付与したい

SaiTan

総合スコア17

Google Apps Script

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

0グッド

1クリップ

投稿2018/10/31 07:46

編集2018/11/01 01:34

先ほど「papinianus」さんに教わりながら一括で複数のスプレッドシートを作成し、
それぞれのスプレッドシートに異なった権限を付与することが出来ましたが、

今回は、一括で「テンプレート」シートから複数のスプレッドシートにコピーし、
各スプレッドシートに異なった権限を付与する方法を知りたいです。

GASの構成を考えたのですが、どのように組み立てたらがいいのかわからず・・
どなたかご教示ください。

大変初心的な質問で申し訳ございません。
何とぞよろしくお願いいたします。

// SS作成 function createSheet(){ //スプレッドシート設定 var ss = SpreadsheetApp.openById('1gmOo8kzMg-5Kir2f75HnhWFCzTRzZRqhi5Zaj8eVYTU') var sheet = ss.getSheetByName("ファイル名・権限付与者"); var range = sheet.getRange('A:A').getValues(); var LastRow = range.filter(String).length; //二次元配列を設定 var objArray = (sheet.getDataRange().getValues()) for(var i = 1;i < objArray.length;i++){ Logger.log(objArray[i][0]); //SS生成 var mySS = SpreadsheetApp.create(objArray[i][0]) //SS権限付与① if(objArray[i][1]){ mySS.addCollaborator(objArray[i][1]);   } //SS権限付与② if(objArray[i][2]){ mySS.addCollaborator(objArray[i][2]);   } //SS権限付与③ if(objArray[i][3]){ mySS.addCollaborator(objArray[i][3]);   } //SS_URL転記 sheet.getRange(i + 1 ,5).setValue(mySS.getUrl()); } }

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

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

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

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

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

SaiTan

2018/11/01 00:36

分かりづらかったようで申し訳ありません。おっしゃる通り2つの質問を組み合わせることで完成しましたが、こちらを実行した結果、何も記載されていないスプレッドシートに権限が付与されることで完成しました。そこで、新たに、例えば請求書を作ったシートをテンプレートとして、このテンプレートをコピーして新たにスプレットシート作成、そこにファイル名と権限付与をつけたい(コード部分「var sheet = ss.getSheetByName("ファイル名・権限付与者");」)のですが、「テンプレート」シートからコピーさせる方法が分かりません。
papinianus

2018/12/04 06:24

best選択するか自己解決してください
guest

回答2

0

ベストアンサー

  • "Aシート"

→コピーするやつ

  • "Bシート"
名前権限1権限2
こぴーぶっくsomeone@gmail.com
こぴーせいきゅうしょsomeone@gmail.comsometwo@gmail.com

のときcopy()を実行すれば、こぴーぶっくにsomeoneの編集権が、こぴーせいきゅうしょにsomeoneとsometwoの編集権が付与された状態で、いずれにもAシートというシートがコピーされ、かつそれが唯一のシートとなって、生成される。
あとはがんばれ。

javascript

1function copy() { 2 const curSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 const templateSheet = curSpreadsheet.getSheetByName("Aシート"); 4 const copyList = curSpreadsheet.getSheetByName("Bシート").getDataRange().getValues(); 5 copyList.shift(); //ヘッダ行を捨てる 6 copyList.forEach(function(element, index, array){ //forEachでループ。elementが1行分 7 const fileName = element[0]; // A列にファイル名 8 const file = SpreadsheetApp.create(fileName); 9 const users = element.slice(1).filter(String); // B列以降で文字になるやつだけフィルタ 10 file.addEditors(users); 11 const copied = templateSheet.copyTo(file); //copyToすると、コピーしたシートが返り値になる 12 copied.setName("Aシート"); //デフォルトで「Aシートのコピー」とかになるのでリネーム 13 trimSheet(file, "Aシート"); 14 }); 15} 16 17function trimSheet(spreadsheet, name) { //スプレッドシートを作ると「シート1」ができちゃうので、指定した名前(name)を持たないシートを消すやつ 18 spreadsheet.getSheets().filter(function(sheet){ return sheet.getName().indexOf(name) === -1}).forEach(function(sheet){spreadsheet.deleteSheet(sheet);}); 19}

投稿2018/11/09 10:35

編集2018/11/14 08:17
papinianus

総合スコア12705

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

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

SaiTan

2018/11/14 08:09

連絡が大変遅くなり申し訳ありません。 成功しました! すごくシンプルなコードで、そういう作りでいいのか、、と勉強になります。 本当にありがとうございました。 また、勝手に指名してしまって申し訳ありませんでした。
papinianus

2018/11/14 08:20

コメントつけました。 gasはですね、古いjavascriptの仕様で動いているので、冗長(シンプルの反対)です。シンプルに書けるようになりたいです。 指名?してもいいんですが、本当に指名したいなら回答依頼というシステムがあるので利用してね。 あと、これが望んだ答えだ!って自分で判定したなら、そのコードは質問者様がいてこそ生まれたものなので、別に名前を出していただく必要はないです。堂々と、ここまで来たので、さらにこれこれしたい、と質問していただければ。
guest

0

こういうことでしょうか?

javascript

1// SS作成 2function createSheet(){ 3 4 //スプレッドシート設定 5 var ss = SpreadsheetApp.openById('1gmOo8kzMg-5Kir2f75HnhWFCzTRzZRqhi5Zaj8eVYTU') 6 var sheet = ss.getSheetByName("ファイル名・権限付与者"); 7 var range = sheet.getRange('A:A').getValues(); 8 var LastRow = range.filter(String).length; 9 10 //二次元配列を設定 11 var objArray = (sheet.getDataRange().getValues()) 12 for(var i = 1;i < objArray.length;i++){ 13 Logger.log(objArray[i][0]); 14 15 //SS生成 16 var mySS = SpreadsheetApp.create(objArray[i][0]) 17 18 //SS権限付与① 19 if(objArray[i][1]){ 20 mySS.addCollaborator(objArray[i][1]); 21 } 22 23 //SS権限付与② 24 if(objArray[i][2]){ 25 mySS.addCollaborator(objArray[i][2]); 26 } 27 28 //SS権限付与③ 29 if(objArray[i][3]){ 30 mySS.addCollaborator(objArray[i][3]); 31 } 32 33 //SS_URL転記 34 sheet.getRange(i + 1 ,5).setValue(mySS.getUrl()); 35 } 36 37 SheetCopySample1(mySS); 38} 39 40function SheetCopySample1(objDestSpreadsheet) { 41 42 //Aファイル 43 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 44// var objDestSpreadsheet = SpreadsheetApp.openById("1Qp3VevQQoLgT_nk9dn_MaZlRSb7bG7WGte5dAwNFO40"); 45 var objSheet = objSpreadsheet.getSheetByName("Aシート"); 46 if(objSheet) { 47 //シートをコピーしてシート名を今日の日付に変更 48 newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));; 49 //作成シートにカーソルをフォーカス 50 objDestSpreadsheet.setActiveSheet(newSheet); 51 //カーソルフォーカスされた作成シートを左から2番目に移動 52 objDestSpreadsheet.moveActiveSheet(2); 53 } 54 55 //Bファイル 56 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 57// var objDestSpreadsheet = SpreadsheetApp.openById("1CX2RfNIDhLCgt4VUNmdwHhlPcZ2g8HYcMgSudNrQUUg"); 58 var objSheet = objSpreadsheet.getSheetByName("Bシート"); 59 if(objSheet) { 60 //シートをコピーしてシート名を今日の日付に変更 61 newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));; 62 //作成シートにカーソルをフォーカス 63 objDestSpreadsheet.setActiveSheet(newSheet); 64 //カーソルフォーカスされた作成シートを左から2番目に移動 65 objDestSpreadsheet.moveActiveSheet(2); 66 } 67 68 //Cファイル 69 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 70// var objDestSpreadsheet = SpreadsheetApp.openById("d/1xNr52XjhSRgQSG1-EJH_LqnN-Gd81N6iLiED1OLNDIw"); 71 var objSheet = objSpreadsheet.getSheetByName("Cシート"); 72 73 if(objShee) { 74 //シートをコピーしてシート名を今日の日付に変更 75 newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));; 76 //作成シートにカーソルをフォーカス 77 objDestSpreadsheet.setActiveSheet(newSheet); 78 //カーソルフォーカスされた作成シートを左から2番目に移動 79 objDestSpreadsheet.moveActiveSheet(2); 80 } 81 82 //Dファイル 83 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 84// var objDestSpreadsheet = SpreadsheetApp.openById("1GefKKvK29yBCbBuBPU9WfYsTb8rm_do0l9QL2qpzzPo"); 85 var objSheet = objSpreadsheet.getSheetByName("Dシート"); 86 if(objShee) { 87 //シートをコピーしてシート名を今日の日付に変更 88 newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));; 89 //作成シートにカーソルをフォーカス 90 objDestSpreadsheet.setActiveSheet(newSheet); 91 //カーソルフォーカスされた作成シートを左から2番目に移動 92 objDestSpreadsheet.moveActiveSheet(2); 93 } 94}

投稿2018/11/08 08:57

papinianus

総合スコア12705

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

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

papinianus

2018/11/08 09:02

これが違うのであれば、これまでの経緯はいいので、やりたいことについて、どういうスプレッドシートにどういうテンプレートなるシートがあって、どれをどこにコピーして、というデータのサンプルを示してください。
SaiTan

2018/11/08 09:29

私からの相談が分かりづらく、大変申し訳ありません、、 改めてご教示いただきたい内容を記載します。 ======================= 1つのファイルの中に2つのシートがあります。  Aシート:テンプレート  Bシート:SSに設定した時のファイル名と、そのSSに付与するアクセス権限者アドレスの一覧(数人) GASで、  ① Aシート(テンプレート 例えば数字が入っていない請求書)をコピーしたシートをSS設定  ② Bシートに記載しているファイル名を①の設定したSSのファイル名に設定  ③ ②で出来上がったSSに、Bシートに記載している付与したいアクセス権限者を設定 という形で作成したいのです。 最初に見ていただいた内容は上記②③だけの内容で、①のAシート(テンプレート)をコピーさせるコードが分かりません。。
papinianus

2018/11/08 09:43

BシートはA列がファイル名でB列から右にユーザのアドレスがある(左寄せ、不揃い)ってことでよいですか?
SaiTan

2018/11/09 02:57

はい、認識いただいているとおりです。 A列:ファイル名 B列:権限付与者①のメールアドレス C列:権限付与者②のメールアドレス D列:権限付与者③のメールアドレス E列:権限付与者④のメールアドレス ・ ・ ・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問