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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

4163閲覧

Googleスプレッドシート「IMPORTRANGE関数」について

yskt

総合スコア16

Google Apps Script

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2018/08/28 09:32

前提・実現したいこと

GoogleスプレッドシートのIMPORTRANGE関数を使用して以下を実現したいと思っております。

ファイルAの値をファイルBに反映させたいです。
ファイルAとファイルBは全く同じFMTです。
単純に値を引っ張って同じものを作成したいということです。
(実際は何ファイルもありそれを一つのファイルにシートを分けて作成したいと思っております。)

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

=IMPORTRANGE("スプレッドシートキー","シート名!A1")

上記関数でうまくいくのですが、こちらをA1からX100まですべてに反映させたい場合
うまく相対参照してくれません。(セルをコピーしてもすべてA1になる)
ダブルクォーテーションで括っているからだとは思うのですが、
なんとかしてセルコピーだけで参照範囲が変わる方法はないでしょうか・・・?

=IMPORTRANGE("スプレッドシートキー","シート名!A1:X100")
上記のようにセル範囲を指定する方法もあるとは思うのですが、
今回は上記の1つのセルを指定したいと思っております。

つたない説明で大変申し訳ございませんが、
ご回答お待ちしております。

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

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

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

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

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

macaron_xxx

2018/08/29 00:10

複数の関数を組み合わせたらできなくはないと思うのですが、「=IMPORTRANGE("スプレッドシートキー","シート名!A1")」こういう形にはなりません。データさせ取得できればOKと考えるか、意味もわかるようにつくるか、ですね。意味もわかるようにつくるのであれば、GASでループしながら値を埋め込むのがいいと思います。
yskt

2018/08/29 04:56

ご回答ありがとうございます!関数の組み合わせにヒントを得まして、何とかできそうです・・!ベストな形かはわかりませんが・・・
guest

回答2

0

ベストアンサー

質問者様にとってのベストアンサーにはならないとは思いますが、何ファイルもあるものを、人間がいちいち関数で書いていくっていうのが信じられないのと、見せるだけならともかく編集とか考えるとコピーとっていじりたいよねっていうのとがあるので、半分自己満足で。

AB
スプレッドシート名1シート1
スプレッドシート名1シート2
スプレッドシート名2シート3
スプレッドシート名3シート4

みたいなコピーしてきたいリストを"シート1"として作っておいて下記のmain()を実行するとコピーできる。
コピーを手抜きしてcopyTo使っているので「シート1のコピー」になるし、シート名が重複していたら「シート1のコピー1」とかになっちゃうけどもまあこのくらいで。

javascript

1function main() { 2 var inputSheet = "シート1"; 3 var self = SpreadsheetApp.getActiveSpreadsheet(); 4 var lists = self.getSheetByName(inputSheet).getDataRange().getValues(); 5 lists.shift(); 6 lists.sort(function(first, second) { 7 if(first[0] > second[0]) { return 1; } 8 if(first[0] < second[0]) { return -1; } 9 if(first[1] > second[1]) { return 1; } 10 if(first[1] < second[1]) { return -1; } 11 return 0; 12 }); 13 var ListObj = lists.reduce(function(prev, cur) { 14 if(cur[0] in prev) { 15 prev[cur[0]].push(cur[1]); 16 }else{ 17 prev[cur[0]] = [cur[1],]; 18 } 19 return prev; 20 }, {}); 21 Object.keys(ListObj).forEach(function(element){ 22 var srcSheet = getSpreadSheetByName(element); 23 if(srcSheet === undefined) { return; } 24 copySheets(self, srcSheet, ListObj[element]); 25 }); 26} 27function getSpreadSheetByName(name) { 28 var files = DriveApp.getFilesByName(name); 29 while(files.hasNext()) { 30 var file = files.next(); 31 if(file.getMimeType() === "application/vnd.google-apps.spreadsheet") {return SpreadsheetApp.openById(file.getId());} 32 } 33 return undefined; 34} 35function copySheets(destSpreadsheet, srcSpreadsheet, sheetNames) { 36 for(var i = 0; i < sheetNames.length; i++) { 37 var src = srcSpreadsheet.getSheetByName(sheetNames[i]); 38 if(src) { 39 src.copyTo(destSpreadsheet); 40 } 41 } 42} 43

投稿2018/08/29 14:54

編集2018/08/31 01:51
papinianus

総合スコア12705

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

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

yskt

2018/08/30 07:14

丁寧にソースコードまで有難うございます。 今回は関数のみで仕上げたいので、使用しませんが、 勉強として一度やってみたいと思います!! ありがとうございます!!!
macaron_xxx

2018/08/30 15:51

To:papinianusさん lists.shift().sort(~); って何をしてるんでしょうか? おそらく lists.shift(); lists.sort(~); わけないといけないのかなぁと思います。 間違ってたらごめんなさい。
papinianus

2018/08/31 01:56

ご指摘ありがとうございます。修正しました。 検証しながら書いてたつもりだったのですが、あらためてmdnを確認したところ当初の私の回答で動くはずはなく、ご指摘のとおりでないと動きません。
guest

0

=importrange("シートID","シート名"&address(row(B1),column(B1)))

上記でやりたいことは実現できました。
もっといい書き方があるとは思うのですが・・

投稿2018/08/29 05:02

編集2018/08/29 05:02
yskt

総合スコア16

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

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

macaron_xxx

2018/08/29 06:58

もうちょっとだけきれいに書くなら =IMPORTRANGE("URL",ADDRESS(ROW(B1),COLUMN(B1),1,TRUE,"シート名")) かな
yskt

2018/08/29 07:27

おお!ありがとうございます。 ちなみになんですが、ADDRESSを範囲で指定することって可能でしょうか・・? =IMPORTRANGE("スプレッドシートキー","シート名!A1:X100") 上記のADDRESS使用ver
macaron_xxx

2018/08/30 22:48

これがしたいのであれば、あなたの回答のように&でつないでいくしかないかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問