先ほど「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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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);});
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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);
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
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選択するか自己解決してください