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

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

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

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

Google Apps Script

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

文字コード

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

5619閲覧

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

shosihnsya

総合スコア2

Google スプレッドシート

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

Google Apps Script

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

文字コード

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/06/26 05:18

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

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

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

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

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

●エラー内容●
Exception: SpreadsheetApp オブジェクトでの openById メソッドまたはプロパティの取得中に予期しないエラーが発生しました。(行 18)

//☆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としておく const copysheet = curSpreadsheet.getSheetByName("Bシート")    var targetURL = copysheet.getRange(2, 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列の人に編集権限を与える ; })}

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

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

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

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

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

papinianus

2020/06/26 07:52

スクリプトを実行しているユーザは、各ユーザ用のスプレッドシートを編集する権限を持っているのでしょうか。 また C 列に記載している文字列のサンプルをお願いします。
shosihnsya

2020/06/26 08:16

C列について 1行目が、URLという項目の名称 2行目以降がスプレッドシートのURLになります。 また、先程権限配布対象のユーザーをスクリプトを実行するユーザーと変更しました。 その後スプレッドシートへの編集権限を持ったアカウントで、再度行いましたが同様のエラーが出ました。
guest

回答1

0

ベストアンサー

スクリプトを実行しているユーザーと権限配布対象のユーザーを同一でしていました。

そうでないと動かないと思います。少なくとも他人の所有するシートへの書き込みは、許可がないと行えないと想像されます。


C 列がそのようになっている場合、以下の処理で取得できる targetId は 1Hmq0NwmX4c0RT2EnlZ431MFBw9s9Kwb8q3CBZUidBM/edit#gid=0 になってしまいます。

javascript

1 var strgoogle = 'https://docs.google.com/spreadsheets/d/'; //URLの固定部 2 var targetId = targetURL.replace(strgoogle, ''); //スプレッドシートのID部を取得

しかし欲しい id は 1Hmq0NwmX4c0RT2EnlZ431MFBw9s9Kwb8q3CBZUidBM なので、さらに下記のようなことをする必要があります。

javascript

1 var strgoogle = 'https://docs.google.com/spreadsheets/d/'; //URLの固定部 2 var tail = '/edit#gid=0'; 3 var targetId = targetURL.replace(strgoogle, '').replace(tail, ''); //スプレッドシートのID部を取得

投稿2020/06/29 14:21

papinianus

総合スコア12705

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

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

shosihnsya

2020/06/30 05:06

ありがとうございます。こちらのエラー解決致しました。 大変助かりました。ループ処理で現在また詰まっており解決できず詰まっております。 もう少し試してみてできないようであればまた、投稿致しますので、機会がありましたらまたよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問