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

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

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

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

Q&A

解決済

3回答

3936閲覧

フォームで入力したスプレッドシートのデータをGASプログラムで削除したい

handymatsu

総合スコア31

Google Apps Script

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

0グッド

0クリップ

投稿2019/02/12 21:16

編集2019/02/13 03:41

前提・実現したいこと

GoogleFormで入力されたGoogleSpreadSheet上のデータがあります。Google Apps Scriptプログラムで,このスプレッドシートファイルのコピーを作り編集しようとしています。具体的には,特定のcolumnを削除したいのです。

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

Google Apps Script上のプログラムではエラーが出ませんが,削除もできません。そこで,手動で特定のcolumnを削除しようとしたところ,

問題が発生しました
フォームデータを含む列は削除できません。代わりに列を非表示にできます。

というメッセージが出ます。
そこで,スプレッドシートの「フォーム」メニューから,「フォームのリンクを解除」を実行すると,Google Apps Scriptプログラムで特定のcolumnを削除できるようになります。
いちいち,手動で解除していては大変なので,フォームのリンクの解除をGoogleAppsScriptプログラムでなんとか実行したいのですが,やり方がわかりません。

マクロの記録をしてみましたが,マクロとしては記録されていませんでした。

該当のソースコード

GoogleAppsScript

1 var ssIDforS = copyFileInFolder(folderId2, ssID0, todayNow+"求人データ(学生用)");//ssID0はformで入力されるspreadSheet 2 var ssForS = new Ssheet(ssIDforS); 3 ssForS.deleteColumn(0,40);//formからのリンクが削除できず,deleteできない 4 5 6 7//フォルダID,ファイルID,ファイル名を受け取り,ファイルIDのコピーをフォルダ内に作成して,ファイルのIDを返す 8function copyFileInFolder(folderID, srcID, fileName) { 9 var originalFile = DriveApp.getFileById(srcID); 10 var folder = DriveApp.getFolderById(folderID); 11 var copiedFile = originalFile.makeCopy(fileName, folder); 12 copiedFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);//リンクからアクセスできる人は編集可能にする 13 var copiedFileId = copiedFile.getId();//コピーのファイルIDをゲット 14 return copiedFileId; 15} 16 17//////////Ssheetクラスの定義開始(コンストラクタとメンバ関数で構成)2019/02/05 18//Ssheetクラスのコンストラクタの記述 19Ssheet = function(id){ 20 this.id = id; 21 this.ssFile = SpreadsheetApp.openById(id); 22 this.ssFileName = this.ssFile.getName(); 23 SpreadsheetApp.setActiveSpreadsheet(this.ssFile);//値を返さない 24 this.activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 25} 26//spreadsheetの指定列colを削除 27Ssheet.prototype.deleteColumn = function(sheet,col){ 28 this.activeSheet = this.activeSpreadsheet.getSheets()[sheet]; 29 this.activeSheet.deleteColumn(col);//列を削除 30} 31 32

試したこと

あきらめて,spreadSheetを新規作成し,セルを一つ一つコピーするGoogleAppsScriptプログラムを作りましたが,ハイパーリンクを含むセルは,見た目のセルの値だけが,コピーされてしまい,ハイパーリンクが消えてしまいます。

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

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

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

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

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

papinianus

2019/02/13 00:44

そもそもなぜそのような業務が頻繁に発生するのでしょうか?フォームに不要な項目があるのであればフォームを見直すべきではないかと思うのですが。
handymatsu

2019/02/13 03:27

コメントありがとうございます。管理者と閲覧者がスプレッドシートを見るのですが,閲覧者には個人情報部分をカットした物を見せるようにしたいためです。
papinianus

2019/02/13 03:42

その利用状況ですと、もしプログラム操作が可能であっても、リンク解除して列を削除する、はやってはいけないことのように思います(その個人情報が失われるので)。回答としてシートの保護を提案いたしました。
handymatsu

2019/02/13 05:07

papinianus様, コメントありがとうございます。 いえ,ファイルはコピーして二つにしますので,そのうちの片方を見せたくない部分だけカットしたいのです。なかなか難しいです。
guest

回答3

0

アドバイスありがとうございました。解決できました。こんな感じです。

GoogleAppsScript

1 var folderId2 = "******************************"; 2 var ssIDforT = createSpreadsheetInFolder(folderId2, "データ(管理用)"); 3 var ssForT = new Ssheet(ssIDforT); 4 ssOrg.sheetCopyToSheetOfAnotherSS(0,ssForT);//ブックssOrgの0番シートをブックssForTに挿入コピー 5 ssForT.deleteSheet(0);//最初からある不要なシートを削除 6 var ssIDforS = createSpreadsheetInFolder(folderId2, "データ(閲覧用)"); 7 var ssForS = new Ssheet(ssIDforS); 8 ssOrg.sheetCopyToSheetOfAnotherSS(0,ssForS); 9 ssForS.deleteSheet(0);//最初からある不要なシートを削除 10 11 12//////////Ssheetクラスの定義開始(コンストラクタとメンバ関数で構成)2019/02/05 13//Ssheetクラスのコンストラクタの記述 14Ssheet = function(id){ 15 this.id = id; 16 this.ssFile = SpreadsheetApp.openById(id); 17 this.ssFileName = this.ssFile.getName(); 18 SpreadsheetApp.setActiveSpreadsheet(this.ssFile);//値を返さない 19 this.activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 20} 21//シートを他のファイルのシートとしてコピー挿入する 22Ssheet.prototype.sheetCopyToSheetOfAnotherSS = function(sheet,dstSS){ 23 this.activeSheet = this.activeSpreadsheet.getSheets()[sheet]; 24 return this.activeSheet.copyTo(dstSS.ssFile); 25} 26///////////////////////////////////Ssheetクラスの定義終了(大半を省略) 27 28 29 30//フォルダID,ファイル名を受け取り,スプレッドシートを指定フォルダ内に新規作成しそのファイルIDを返す 31function createSpreadsheetInFolder(folderID, fileName){ 32 var folder = DriveApp.getFolderById(folderID); 33 var newSS=SpreadsheetApp.create(fileName); 34 var originalFile=DriveApp.getFileById(newSS.getId()); 35 var copiedFile = originalFile.makeCopy(fileName, folder); 36 DriveApp.getRootFolder().removeFile(originalFile); 37 var copiedFileId = copiedFile.getId();//コピーのファイルIDをゲット 38 return copiedFileId; 39}

投稿2019/02/13 08:16

編集2019/02/13 08:21
handymatsu

総合スコア31

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

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

0

回答の一部を隠蔽して参照させたい、という用途であれば、

  • 列の非表示
  • シートの保護

で良いのではないでしょうか?
URLがクリックできる状態になるかは確認していませんが、すくなくとも保護されたシートでもフォームからの書き込みが行え、保護シートを編集する権限がないユーザは列を再表示できないことを確認しての回答です。

投稿2019/02/13 03:39

papinianus

総合スコア12705

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

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

handymatsu

2019/02/13 03:52

papinianus様, アドバイスありがとうございます。 状況の説明不足で,申し訳ありません。実は, ●絶対に見せたくない列 ●必要に応じて見せたい列 ●常に見せたい列 の3種類あります。スプレッドシートはエクセルに変換して,メール添付で配布しますが,常に見せたい列だけが見える状態で配布します。閲覧者は必要に応じて再表示して閲覧します。個人情報については最初からカットしてしまいたい・・・,という状況です。
handymatsu

2019/02/13 03:58

絶対に見せたくない列は,メールアドレスや氏名で,これは管理者だけが見たいという状況です。
guest

0

ベストアンサー

JavaScript

1var newSheet = SpreadsheetApp.create(”newSheet”); 2var sheet = SpreadsheetApp.getActiveSheet().copyTo(newSheet);

新規にスプレットシートを作成して、そこにシートのコピーを作成するのはどうでしょうか。

投稿2019/02/13 00:33

編集2019/02/13 04:49
teritama

総合スコア126

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

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

handymatsu

2019/02/13 03:36

teritama様, ご回答,ありがとうございます。 確かにできる可能性がありそうです。 ただ,スプレッドシートはエクセルにして,メール添付で送信します。 ですので,見せたくないデータも入っているデュプリケート元が, 消せるとよいのですが・・・おそらく同様のエラーで無理じゃないかと 思います。
handymatsu

2019/02/13 03:48

今試してみましたが,デュプリケートして新しくできたシート上では削除できました。しかし,デュプリケート元のシートは削除できませんでした。残念。
handymatsu

2019/02/13 03:56 編集

しかし,エクセルに変換して,メール添付で受け取るので,受け取った時点でデュプリケート元を手動削除すれば良いですね。あと一息で完全自動処理になるのですが,とりあえず手間はかなり減りそうです。
teritama

2019/02/13 04:24

それでしたら、新規にスプレットシートを作成して、そこにシートのコピーを作成したら良さそうな気がします。
handymatsu

2019/02/13 05:11 編集

teritama様 それが,そううまくいかないのです。 シートのコピーですが,getValuesを使うしか方法が浮かばないのですが, あるセルが,=HYPERLINK("https://drive.google.com/a/to*************.jp/file/d/1ul*************x7/view?usp=drivesdk","文字列") となっていて,getValuesとsetValuesでコピーすると,見かけ上表示されている"文字列"だけコピーされて,ハイパーリングがきれいさっぱり削除されてしまうのです。これで悩んでいます。
papinianus

2019/02/13 05:23

回答編集後のコメントでも誤解なさっておられるようなので。 teritama様が改訂した回答では、新規に作った別のスプレッドシート(ブック)にシートをコピーしているので、getValueにまつわる不備は回避されているのでは?
handymatsu

2019/02/13 05:52

papinianus様 確かに誤解していたのですが,teritama様のJavaScriptを見て,別のブックとは気がつきませんでした。早速試してみます。
handymatsu

2019/02/13 08:22

teritama様,papinianus様, アドバイス,ありがとうございました。上に書きましたとおり,解決できました。結構めんどくさかったですが,思った通りの動作を実現できました。
teritama

2019/02/13 20:11

papinianus様 コメントのフォローありがとうございます。 handymatsu様 言葉足らずですみませんでした。 実現できてよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問