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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

2879閲覧

GAS マスタシートを別スプレッドシートへコピー+編集権限付与 コードエラーの原因

shosihnsya

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/06/26 02:07

前提・実現したいこと

現状と実現したい方法は以下になります。

勤怠管理用スプレッドシートがあり中に現在以下のシートがあります。
①Aシート-テンプレのシート
②Bシート-氏名(A列)、メールアドレス(B列)、各ユーザー用のスプレッドURL(C列)

②の各ユーザー用のスプシURLに①のコピーを作り、かつ編集権限を与えたいです。

検索して、それらしきもの2つを組み合わせて作りましたが、エラーが出ており、
原因がわからない状態です。

自分なりにわかるようにコードに説明を入れて調べていたのですが、詰まってしまい助言を頂けますと幸いです。

発生している問題・エラーメッセージ

エラーメッセージ

TypeError: copyList.getRange is not a function(行 12)

該当のソースコード

//☆Aシートがテンプレ、Bシートから編集権限やコピー先のスプレッドシートを指定すると宣言 function copy() { const curSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const templateSheet = curSpreadsheet.getSheetByName("Aシート");//Nameの変更必要あり const copyList = curSpreadsheet.getSheetByName("Bシート").getDataRange().getValues();//Nameの変更必要あり copyList.shift(); //ヘッダ行を捨てる copyList.forEach(function(element, index, array){ //forEachでループ。elementが1行分 //☆C列のスプシIDの先にAシートをコピー // Bシートのスプレッドシートの3列目からをtargetURLとしておく var row = 3; row <= 10; row++    var targetURL = copyList.getRange(row, 3).getValue(); if (targetURL == '') //セルが空白の場合はスキップ var strgoogle = 'https://docs.google.com/spreadsheets/d/'; //URLの固定部 var targetId = targetURL.replace(strgoogle, ''); //スプレッドシートのID部を取得 //ID指定でスプレッドシートを開き、指定のシートを取得 var targetSS = SpreadsheetApp.openById(targetId); // 上記で取得したシートを、そのスプレッドシートにコピー const copied =templateSheet.copyTo(targetSS); copied.setName("Aシート"); //デフォルトで「Aシートのコピー」とかになるのでリネーム //☆B列のメールアドレスの人へ編集権限を与える const users = element.slice(1).filter(String); // B列以降で文字になるやつだけフィルタ,URLでもIDでもOK file.addEditors(users);//B列の人に編集権限を与える ; })}

試したこと

自身で検索

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

var targetURL = copyList.getRange(row, 3).getValue();

getRangeを使うためには、getRangeの左側(今回でいえばcopyList)が
「どのスプレッドシートのどのシートなのか」を示している必要があります。
例えばcopyListがAのスプレッドシートのBというシートを示していれば、
copyList.getRange(row, 3) は
AのスプレッドシートのBというシートの中で、row行目の3列目のセルを参照する
となる訳です。

 
しかし今回、copyListが何を示しているかというと

const copyList = curSpreadsheet.getSheetByName("Bシート").getDataRange().getValues();

これは、
現在アクティブになっているスプレッドシートのBシートというシートの中に入っているデータの一覧
です。
getRangeの左側はシートを指定しなければならないのに、copyListはセルに入っている値の一覧を示しています。
別でシートを指定する変数を用意するなどしてみてはいかがでしょうか。

投稿2020/06/26 04:11

mkk

総合スコア378

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

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

shosihnsya

2020/06/26 04:39

とてもわかり易いご回答ありがとうございます。 データの一覧になってしまっていて、リスト自体の指定がないのですね。 試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問