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

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

ただいまの
回答率

90.45%

  • Google Apps Script

    1341questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 416

SaiTan

score 5

先ほど「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());

  }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2018/11/01 00:22 編集

    名前書かれた質問は初めて拝見しました。https://teratail.com/questions/154944のSheetCopySample1とhttps://teratail.com/questions/155371のcreateSheet_testを組み合わせるだけのように思いますが、どこが分からないのでしょうか。もちろん組み合わせるといったってそれなりに順序は考える必要はあるでしょうが、この2つができてて、組み合わせだけができないっていうのが分からないです。逆にこの2つの組み合わせ方の助言が欲しいなら、どういうスプレッドシートがあってそれぞれどういうシートを含むのかなど詳細が必要だと思います。

    キャンセル

  • SaiTan

    2018/11/01 09:36

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

    キャンセル

  • papinianus

    2018/12/04 15:24

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

    キャンセル

回答 2

checkベストアンサー

+1

  • "Aシート"
    →コピーするやつ

  • "Bシート"

名前 権限1 権限2
こぴーぶっく someone@gmail.com
こぴーせいきゅうしょ someone@gmail.com sometwo@gmail.com

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

function copy() {
  const curSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const templateSheet = curSpreadsheet.getSheetByName("Aシート");
  const copyList = curSpreadsheet.getSheetByName("Bシート").getDataRange().getValues();
  copyList.shift(); //ヘッダ行を捨てる
  copyList.forEach(function(element, index, array){ //forEachでループ。elementが1行分
    const fileName = element[0]; // A列にファイル名
    const file = SpreadsheetApp.create(fileName);
    const users  = element.slice(1).filter(String); // B列以降で文字になるやつだけフィルタ
    file.addEditors(users);
    const copied = templateSheet.copyTo(file); //copyToすると、コピーしたシートが返り値になる
    copied.setName("Aシート"); //デフォルトで「Aシートのコピー」とかになるのでリネーム
    trimSheet(file, "Aシート");
  });
}

function trimSheet(spreadsheet, name) { //スプレッドシートを作ると「シート1」ができちゃうので、指定した名前(name)を持たないシートを消すやつ
  spreadsheet.getSheets().filter(function(sheet){ return sheet.getName().indexOf(name) === -1}).forEach(function(sheet){spreadsheet.deleteSheet(sheet);});
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/14 17:09

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

    キャンセル

  • 2018/11/14 17:20

    コメントつけました。
    gasはですね、古いjavascriptの仕様で動いているので、冗長(シンプルの反対)です。シンプルに書けるようになりたいです。

    指名?してもいいんですが、本当に指名したいなら回答依頼というシステムがあるので利用してね。
    あと、これが望んだ答えだ!って自分で判定したなら、そのコードは質問者様がいてこそ生まれたものなので、別に名前を出していただく必要はないです。堂々と、ここまで来たので、さらにこれこれしたい、と質問していただければ。

    キャンセル

0

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

// 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());
  }

  SheetCopySample1(mySS);
}

function SheetCopySample1(objDestSpreadsheet) {

  //Aファイル
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
//  var objDestSpreadsheet = SpreadsheetApp.openById("1Qp3VevQQoLgT_nk9dn_MaZlRSb7bG7WGte5dAwNFO40");
  var objSheet = objSpreadsheet.getSheetByName("Aシート");
  if(objSheet) {
    //シートをコピーしてシート名を今日の日付に変更
    newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));;  
    //作成シートにカーソルをフォーカス
    objDestSpreadsheet.setActiveSheet(newSheet);
    //カーソルフォーカスされた作成シートを左から2番目に移動
    objDestSpreadsheet.moveActiveSheet(2);
  }

  //Bファイル 
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
//  var objDestSpreadsheet = SpreadsheetApp.openById("1CX2RfNIDhLCgt4VUNmdwHhlPcZ2g8HYcMgSudNrQUUg");
  var objSheet = objSpreadsheet.getSheetByName("Bシート");  
  if(objSheet) {
    //シートをコピーしてシート名を今日の日付に変更
    newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));;      
    //作成シートにカーソルをフォーカス
    objDestSpreadsheet.setActiveSheet(newSheet);
    //カーソルフォーカスされた作成シートを左から2番目に移動
    objDestSpreadsheet.moveActiveSheet(2);
  }

  //Cファイル   
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
//  var objDestSpreadsheet = SpreadsheetApp.openById("d/1xNr52XjhSRgQSG1-EJH_LqnN-Gd81N6iLiED1OLNDIw");
  var objSheet = objSpreadsheet.getSheetByName("Cシート");  

  if(objShee) {
    //シートをコピーしてシート名を今日の日付に変更
    newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));;      
    //作成シートにカーソルをフォーカス
    objDestSpreadsheet.setActiveSheet(newSheet);
    //カーソルフォーカスされた作成シートを左から2番目に移動
    objDestSpreadsheet.moveActiveSheet(2);
  }

  //Dファイル   
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
//  var objDestSpreadsheet = SpreadsheetApp.openById("1GefKKvK29yBCbBuBPU9WfYsTb8rm_do0l9QL2qpzzPo");
  var objSheet = objSpreadsheet.getSheetByName("Dシート");  
  if(objShee) {
    //シートをコピーしてシート名を今日の日付に変更
    newSheet = objSheet.copyTo(objDestSpreadsheet).setName(Utilities.formatDate(new Date(), "Asia/Tokyo", "MM-dd"));;      
    //作成シートにカーソルをフォーカス
    objDestSpreadsheet.setActiveSheet(newSheet);
    //カーソルフォーカスされた作成シートを左から2番目に移動
    objDestSpreadsheet.moveActiveSheet(2);
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/08 18:02

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

    キャンセル

  • 2018/11/08 18:29

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

    最初に見ていただいた内容は上記②③だけの内容で、①のAシート(テンプレート)をコピーさせるコードが分かりません。。

    キャンセル

  • 2018/11/08 18:43

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

    キャンセル

  • 2018/11/09 11:57

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


    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Google Apps Script

    1341questions

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

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